int const i = 10;
int *j = &i;
*j = 20;
printf("%d",i);
如果我是常数,不应该通过指针改变它。如果不是它不改变的条件是什么?
答案 0 :(得分:3)
编译器应该为此行发出警告:int *j = &i;
。您将非const限定指针指向const限定对象。
稍后尝试通过i
指针修改j
时,行为未定义:
i
可写,则可能会被修改,这就是您所观察到的内容。i
,编译器可能会将其定位在只读段中,并且尝试可能会因分段错误而失败。尝试编译并运行此程序:
#include <stdio.h>
int const i = 10;
int main(void) {
int *j = &i;
*j = 10;
printf("%d\n", i);
return 0;
}
答案 1 :(得分:2)
You can change a const
variable but the behavior is undefined。
您的编译器应警告以下行中const
的丢失,
int *j = &i;
所以const
的工作方式与此完全相同,它只会阻止您意外更改const
变量,因为您在使用之前会听取编译器并修复代码。
但是,您无法直接分配到i
。
但是通过指针你可以随时摆脱const
。在你摆脱const
之前你应该知道是否定义了结果行为,这有时候很好,但是如果你必须这样做,那么可能意味着你有设计问题。