我读了很多老问题,很多关于一个声明中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 *是指向constant integer的指针,为什么允许ptr_i=&i;i不是常数整数.

此外,如果i的值从1变为2(显然,这是可能的,因为i不是一个常数整数),第二个printf显示2.我并不感到惊讶,因为i的值已经改变,而ptr_i是指向i的指针.

我还判断了ptr_i的值没有改变(printf("%p ",ptr_i)).

我的误解在哪里?

推荐答案

如果int const *是指向constant integer的指针,则为…

int const *不是指向常量整数的指针.它是指向int的指针,对于int类型用const限定.

const是一个错误的名称."只读"更接近于准确的描述;它意味着"使用这种类型,值将只被读取".这意味着其他人有不同的指针(相同的值,不同的类型)可以写入对象.

它也不是纯只读的.在C语言中,如果一个对象没有定义const,但你有一个指向它的指针类型为const int *,你可以将指针转换为int *,并使用新的指针来修改对象,这是由C语言标准定义的.const是后来添加到语言中的,所以它有点嫁接而不是完全集成,它不能作为防止写入对象的完整解决方案.大多数情况下,它执行一个advisory服务:当一个类型被限定为const时,编译器必须警告你试图直接使用它来修改它指向的对象.这有助于程序员避免bug.

C++相关问答推荐

如何用C(使用两个s补数算术的32位程序)计算

使用SWI—Prolog的qsave_program生成二进制文件有什么好处?'

如何解决C中的严格别名?

为什么在此程序中必须使用Volatile关键字?

fwrite无法写入满(非常大)缓冲区

是什么让numpy.sum比优化的(自动矢量化的)C循环更快?

对重叠字符串使用MemMove

在Apple Silicon上编译x86的Fortran/C程序

C指针概念分段故障

不同出处的指针可以相等吗?

C堆栈(使用动态数组)realloc内存泄漏问题

是否定义了此函数的行为?

如何将C中的两个字符串与从文件接收的字符串中的字符数进行比较

为什么realloc函数在此代码中修改变量?

错误:字符串在C中获得意外输出

强制GCC始终加载常量(即只读),即使启用了优化

分支预测和UB(未定义的行为)

C/C++编译器可以在编译过程中通过按引用传递来优化按值传递吗?

char* 上的 free() 被 valgrind 识别为无效

如何在Linux上从控制台左上角开始打印文本?