如果我可以通过C中的指针修改它,那么const限定符的目的是什么?

可能重复:
这个邪恶的演员是否被邪恶的编译器打败了?

你好,

如果我可以通过指针修改常量,那么它的目的是什么? 以下是代码:

#include  #include  int main() { const int a = 10; int *p = (int *)&a; printf("Before: %d \n", a); *p = 2; /*a = 2; gives error*/ printf("After: %d \n", *p); return 0; } 

OUTPUT:

之前:10
之后:2
按任意键继续 。 。 。

使用Visual Studio 2008。

你可以修改这个值的原因是因为你做了一个指针类型转换,它剥离了const

 int *p = (int *)&a; 

这将const int* (即&a )强制转换为int * ,允许您自由地修改变量。 通常编译器会警告您这一点,但显式类型转换会抑制警告。

const背后的主要原理是防止你意外地修改你承诺不会修改的东西。 正如你所见,它并不是神圣不可侵犯的,你可以抛弃不受惩罚的事情,就像你可以做其他不安全的事情一样,例如将指针转换为整数,反之亦然。 我的想法是你应该尽量不要乱用const ,如果你这样做,编译器会警告你。 当然,添加一个演员告诉编译器“我知道我在做什么”,所以在你的情况下,上面不会产生任何类型的警告。

如果我可以通过指针修改常量那么它的目的是什么? 下面是代码:

这是未定义的行为,应该不惜一切代价避免:

§C996.7.3p5

如果尝试通过使用具有非const限定类型的左值来修改使用const限定类型定义的对象, 则行为未定义