将常量变量的地址分配给非常量指针

4
我有一个问题。
const int a=10;
int *ptr;
ptr = (int *)&a;

在上面的第三行中,(int *) 的用途是什么?
就像上面所述,如果我们有
char str[]="abc";
char *pc;
pc = str;

上述分配是否正确,如果是的话,为什么不在第一种情况下。
4个回答

3

--> const int i = 10;

i存储在只读区域。(基本上是告诉编译器这个值不能被改变)

i"const int"类型,而&i"const int *"类型。

所以需要进行类型转换。

int *ptr = (int *)&i;来匹配它

您可以通过以下方式避免这种情况的发生:

`int const *ptr = &i;`        

p 的类型是“const int”,类型匹配没有问题。

----------更新您的查询内容-------

可以用以下两种方式声明指向常量的指针。

1)const int *ptr; 或者 int const *ptr; 两者相同。

但是不是这样 ---> 2)int *const ptr; 和第一种情况相同,这是指向变量的常量指针。

在情况1)中,我们可以将指针更改为指向任何其他整数变量,但不能更改使用指针ptr指向的对象的值(实体)。

在情况2)中,我们可以更改指针指向的对象的值,但不能更改指针以指向另一个变量


如果我们不想进行类型转换,我们必须声明它为:1)int const *ptr 或 2)int *const ptr,两者是相同的东西。 - user3794823
@user3794823 不是,它们是不同的。请参见上面更新的答案。 - vinay hunachyal

2

如果没有进行类型转换,你将会收到编译器的警告。&a 是一个 const int * 而不是 int *。


2
“const int a” 是一个常量整数。它不能被修改。如果您试图给它赋值,编译器将不允许您这样做。如果您成功地绕过编译器,您的程序可能会崩溃或更糟。
“int *ptr”是指向非常量整数的指针。如果您写一个分配“*ptr = 100;” 的语句,编译器将允许它而没有任何问题。如果ptr是空指针或未定义的,则可能会导致崩溃或更糟糕的情况发生。如果ptr指向非常量整数,则将100分配给该整数。如果ptr指向常量整数,则会发生崩溃或更坏的情况。
因此,编译器不允许您将a的地址分配给p。因为那是在寻找麻烦。
现在分配“ptr = (int *)&a”。&a是a的地址。a是一个常量整数,&a是常量整数的指针。(int *)是一个转换。您告诉编译器将&a转换为“指向int”的指针。因为它是指向int的指针,而不是指向const int的指针,所以您可以将其分配给ptr。但是ptr指向的东西仍然是常量a。
如果您读取 *ptr,这将正常工作。读取*ptr将给出数字10。写入*ptr,如*ptr = 100,将导致崩溃或更糟的情况发生。基本上,通过使用强制转换,您告诉编译器“闭嘴,我知道我在做什么”。你最好这样做。

0
你需要进行类型转换,因为你忘记将ptr声明为指向常量整数的指针:
int const *ptr;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接