C++ 非常量指针能否修改常量变量int c++;?

C++ 非常量指针能否修改常量变量int c++;?,c++,pointers,constants,C++,Pointers,Constants,以下是我的测试代码: #define print(A) cout << #A << " = " << A << endl; int main() { const int e = 2; int *p = (int *)&e; *p = 4; print(e); print(*p); print(&e); print(p); } 既然“p”根据他们相同的地址指向“e”,那么

以下是我的测试代码:

#define print(A) cout << #A <<  " = " << A <<  endl;
int main()
{
    const int e = 2;
    int *p = (int *)&e;
    *p = 4;

    print(e);
    print(*p);
    print(&e);
    print(p);
}

既然“p”根据他们相同的地址指向“e”,那么*p和“e”怎么会不同呢???这可能很危险,对吧?

扔掉
const
是合法的;使用由此获得的指针(或引用)来(尝试)修改
const
对象是非法的


您的代码导致未定义的行为;它可以做任何事情,而且不必有任何意义。

以任何方式修改常量变量都会导致未定义的行为
是的,这很危险。

未定义的行为意味着任何行为都是可能的,您不能期望任何有效的行为。编译器可以自由地给出任何结果,标准允许这样做。一旦调用UB,程序就不再是有效程序。因此最好避免任何导致UB的代码。

它们可以不同,因为“e”是常量,所以任何合适的编译器都会在编译时插入值,而不是从内存中读取

由于您使用了地址,所以它仍然有一个“真实”变量,但实际上它并没有在您的案例中使用

你“幸运”的是,你可以修改所有的值;由于它被声明为“const”,编译器可以将其放入只读内存中


无论哪种方式,修改常量值都会产生“未定义的行为”。幸运的是,你没有用你愚蠢的游戏毁灭世界。

你试图写一个常量变量(是的,名字很矛盾,但我离题了),这是一种未定义的行为。

你在抛弃常量。这是给你错误的值,这是未定义的行为。 应该是

int e = 2;
int* p = (int *)&e;
*p = 4;

后一种方法在写入常量时会给您带来编译错误

定义变量:

 const int e = 2;
指令const告诉c/c++编译器检查e变量的L值,编译器将阻止您的代码为e分配新值

int* p = (int *)&e;

p是指针(也是int 4字节),可以分配任何值,p=((int*)e)-2)+2。编译器不需要检查*p是否为常量。我认为这是一种灵活的c/c++语言,更好的方法是避免使用指针。

使用
const\u cast
代替,或者使用const int*可能的副本。如果编译器将常量放入只读页,尝试更改它将触发一般保护错误。您调用UB。任何事情都可能发生。
 const int e = 2;
int* p = (int *)&e;