Aki*_*nka 0 c++ int pointers constants
请看,我const int & a = 1通过引用定义,并强制指针转换pa为a,并通过更改 来更改 a 的值pa。这是成功的。
但当const int k = 1定义了 并重复上述操作时,虽然pk和k是相同的地址,* pk但k不是相同的值。
其背后的原理是什么?
您能解释一下当我这样做时IDE如何处理内存分配吗?
const int &a = 1;
int *pa = (int*)&a;
cout << &a << endl;
cout << pa << endl;
*pa = 2;
cout << a << endl;
//And here is the outcome.
//0x7ffeeb5d8a24
//0x7ffeeb5d8a24
//2
Run Code Online (Sandbox Code Playgroud)
这样到这里我们就改a成功了。
const int k = 1;
cout << &k << endl;
int *pk = (int*)&k;
cout << &k << endl;
cout << pk << endl;
*pk = 2;
cout << *pk << ' ' << k;
//0x7ffeeb5d8a14
//0x7ffeeb5d8a14
//0x7ffeeb5d8a14
//2 1
//Process finished with exit code 0
Run Code Online (Sandbox Code Playgroud)
*pk和k这里有相同的地址,但不同的值!怎么会发生这种事?
这在技术上是未定义的行为。const即使您放弃了数据的常量性,在运行时修改数据也是不安全的。只有最初是非的const并且const后来添加到其中的数据才能安全地丢弃const。
但是,为了解释为什么您看到的输出让您感到困惑 - 答案是编译器优化!
编译器将其视为const int k = 1;编译时常量,并假设k永远不会更改值(确实如此!)。当编译器看到时cout << *pk << ' ' << k;,允许在编译时用调用站点处的k值替换,因此无论您在运行时做什么,您都在真正执行。但是,由于这是您获取地址的编译时常量,因此它必须存储在内存中,并且编译器可以自由(并且可能会)将该值存储在只读内存中。在运行时更改此类内存可能会使您的应用程序崩溃,但这并不能保证。1cout << *pk << ' ' << 1;k k