我读了很多老问题,很多关于const
声明中关键字的答案,以深入理解声明的语法。
我玩过const
,现在我对这个例子有点困惑:
int i;
i=1;
int const *ptr_i;
ptr_i=&i;
printf("%d\n",*ptr_i);
i=2;
printf("%d\n",*ptr_i);
如果是指向常量整数的int const *
指针,为什么允许?不是常整数。ptr_i=&i;
i
此外,如果 的值i
从 1 更改为 2(显然,这是可能的,因为i
不是常整数),第二个printf
显示 2。我并不感到惊讶,因为 的值i
已更改并且ptr_i
是指向 的指针i
。
我还检查了 ptr_i 的值没有改变(printf("%p ",ptr_i)
)。
我的误会在哪里?
int const *
不是指向常量整数的指针。它是一个指向 的指针int
,其类型int
由 限定const
。const
是用词不当。“只读”更接近准确的描述;这意味着“对于这种类型,该值只能被读取”。这意味着具有不同指针(相同值、不同类型)的其他人可以写入该对象。它也不是纯粹的只读。在 C 中,如果一个对象没有定义
const
,但有一个类型为 的指针const int *
,则可以将该指针转换为int *
并使用新指针来修改该对象,这是由 C 标准定义的。const
它是较晚添加到该语言中的,因此它在某种程度上是嫁接的,而不是完全集成的,并且它不能作为防止写入对象的完整解决方案。大多数情况下,它执行咨询服务:当类型用 限定时const
,编译器必须警告您尝试直接使用它来修改它指向的对象。这可以帮助程序员避免错误。您决定不应使用此指针更改
ptr_i
(在本例中)引用的对象。i
但是这个指针可以引用一个非const
对象。它不会以相反的方式工作。
在上面的代码片段中,当您修改限定对象时,
*ptr = 6;
会调用未定义的行为const
。