我对以下代码中发生的事情感到有点困惑:
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的地址?
const int z = 420;
printf("\n%d | %d",z ,*(&(*(&z+1))-1) );
// O/P:420 | 420
printf("\n%u | %u",&z,(&(*(&z+1))-1) ); //address
// O/P:1310548 | 1310548
*((char *)&z+1) = 21; //I change value for the 1st-Bit
//corrupting constant
printf("\n%d | %d",z ,*(&(*(&z+1))-1) );
//the complex(not really) expression evaluates to z
// O/P:420| 5540
printf("\n%u | %u",&z ,(&(*(&z+1))-1) );
//the complex(not really) expression evaluates to &z
// O/P:1310548 | 1310548
Run Code Online (Sandbox Code Playgroud)
为什么会这样?
似乎我已成功修改了C中的常量
通过修改我的意思是我已经改变了常量地址范围中的位
因为"复杂(不是真的)统一/身份表达"在腐败后改变了价值.
但是z保持不变.为什么?
在解引用时,同一地址如何具有不同的值.?
PS:你可以使用任何身份表达
eg.printf("%d",*(int*)((char*)&(*((char*)&z+1))-1));
Run Code Online (Sandbox Code Playgroud)
[编辑]
好吧让我重新说一下:
z = 420
&z …Run Code Online (Sandbox Code Playgroud)