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

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,如果你这样做,编译器会警告你.当然,添加一个演员告诉编译器"我知道我在做什么",所以在你的情况下,上面不会产生任何类型的警告.


Sie*_*geX 9

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

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

§ C99 6.7.3p5

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

  • @GMan牺牲一个人的自我以防止UB保证在Coding Nirvana中的一个位置,其中`static`关键字只有一个含义并且Perl 6的发布日期是已知的. (6认同)