inf*_*oop 7 c pointers const qualifiers
可能重复:
邪恶的演员是否被邪恶的编译器打败了?
你好,
如果我可以通过指针修改常量,那么它的目的是什么?以下是代码:
#include <stdio.h>
#include <stdlib.h>
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;
}
Run Code Online (Sandbox Code Playgroud)
OUTPUT:
之前:10
之后:2
按任意键继续...
使用Visual Studio 2008.
tem*_*def 12
你可以修改该值的原因是因为你做了一个指针类型转换,剥离了constness:
int *p = (int *)&a;
Run Code Online (Sandbox Code Playgroud)
这种类型转换为const int*(即&a)到一个int *,允许您自由地修改变量.通常,编译器会警告您这一点,但显式类型转换会抑制警告.
背后的主要理由const是防止你意外修改你承诺不会做的事情.正如你所看到的那样,这并不是神圣不可侵犯的,你可以放弃const逍遥法外,就像你可以做其他不安全的事情一样,例如将指针转换为整数,反之亦然.我们的想法是你应该尽量不要乱用const,如果你这样做,编译器会警告你.当然,添加一个演员告诉编译器"我知道我在做什么",所以在你的情况下,上面不会产生任何类型的警告.
如果我可以通过指针修改常量那么它的目的是什么?下面是代码:
这是未定义的行为,应该不惜一切代价避免:
§ C99 6.7.3p5
如果尝试通过使用具有非const限定类型的左值来修改使用const限定类型定义的对象,则行为是未定义的.