我有一个问题:
const int a = 10;
int *ptr;
ptr = (int *)&a;
上面第三行的(
int *
)有什么用?
就像上面一样,如果我们有:
char str[] = "abc";
char *pc;
pc = str;
以上分配正确吗?
如果是,那为什么不是第一种情况?
-->
const int i = 10;
i
存储在只读区域。(主要是告诉编译器该值不能更改)
i
属于 "const int"
类型,并且 &i
属于 "const int *"
类型。
所以需要类型转换。
int *ptr = (int *)&i;
来匹配它
您可以通过如下声明来避免它
`int const *ptr = &i;`
p is of type "const int"
,类型匹配没有问题
----------已更新您的查询--------
指向常量的指针可以通过以下两种方式声明。
1)
const int *ptr;
或者
int const *ptr;
两者都是一样的。
但不是这个 ---> 2)
int *const ptr;
与第一个相同,这是指向变量的常量指针。
在情况 1 中)我们可以更改指针以指向任何其他
integer variable
,但不能更改使用指针 ptr 指向的 value of object
(实体)。
情况2)我们可以改变指针指向的
value of object
,但不能改变pointer to point another variable
。
如果没有该转换,您将收到编译器警告。 &a 是 const int * 不是 int *。
“const int a”是常量整数。它无法修改。如果你尝试给它赋值,编译器不会让你这样做。如果你成功地耍花招来绕过编译器,你的程序可能会崩溃或更糟。
“int* ptr”是指向非常量整数的指针。如果你写一个作业“*ptr = 100;”编译器将允许它没有任何问题。如果 ptr 是空指针或未定义,则会崩溃或更糟。如果 ptr 指向非常量整数,它将为该整数分配 100。如果 ptr 指向一个常量整数,它将崩溃或更糟。
因此,编译器不允许将 a 的地址分配给 p。因为这是自找麻烦。
现在赋值“ptr = (int *)&a;”。 &a是a的地址。 a 是常整数,&a 是指向常整数的指针。 (int *) 是一个 cast。您告诉编译器将 &a 转换为“指向 int 的指针”。因为它是指向 int 的指针,而不是指向 const int 的指针,所以可以将其分配给 ptr。但ptr指向的东西仍然是a,而且仍然是常量。
如果您阅读 *ptr,这将工作得很好。读取 *ptr 将给出数字 10。写入 *ptr,例如 *ptr = 100,将会崩溃或更糟。基本上,通过使用强制转换,您告诉编译器“闭嘴,我知道我在做什么”。你最好这样做。
您需要强制转换,因为您忘记将 ptr 声明为指向常量 int 的指针:
int const *ptr;