jas*_*ine 13 c++ pointers casting const-correctness
我对以下代码中发生的事情感到有点困惑:
const int e = 2;
int* w = ( int* ) &e; // (1) cast to remove const-ness
*w = 5; // (2)
cout << *w << endl; // (3) outputs 5
cout << e << endl; // (4) outputs 2
cout << "w = " << w << endl; // (5) w points to the address of e
cout << "&e = " << &e << endl;
Run Code Online (Sandbox Code Playgroud)
在(1)中,w指向e的地址.在(2)中,该值变为5.但是,当显示*w和e的值时,它们的值不同.但是如果你打印w指针和&e的值,它们具有相同的值/地址.
为什么e仍然包含2,即使它被改为5?他们存放在一个单独的位置?还是暂时的?但是,为什么w指出的价值仍然是e的地址?
小智 17
正如我在评论中所说,一旦修改了const值,你就处于未定义的行为状态,所以谈论正在发生的事情并没有多大意义.但到底是什么..
cout << *w << endl; // (3) outputs 5
cout << e << endl; // (4) outputs 2
Run Code Online (Sandbox Code Playgroud)
猜测*w是,正在运行时进行评估,但是e被视为编译时常量
我怀疑你正在绊倒编译器.它不希望你用e玩肮脏的技巧,所以当它看到线时:
cout << e << endl;
Run Code Online (Sandbox Code Playgroud)
它只是插入值2而不是查找实际值.您可以通过查看程序的反汇编来验证(或反驳)这一点.