为什么两个 const int 对象在“const”强制转换后具有相同的地址但值不同?

Aki*_*nka 0 c++ int pointers constants

请看,我const int & a = 1通过引用定义,并强制指针转换paa,并通过更改 来更改 a 的值pa。这是成功的。

但当const int k = 1定义了 并重复上述操作时,虽然pkk是相同的地址,* pkk不是相同的值。

其背后的原理是什么?

您能解释一下当我这样做时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)

*pkk这里有相同的地址,但不同的值!怎么会发生这种事?

Rem*_*eau 5

这在技术上是未定义的行为const即使您放弃了数据的常量性,在运行时修改数据也是不安全的。只有最初是非的const并且const后来添加到其中的数据才能安全地丢弃const

但是,为了解释为什么您看到的输出让您感到困惑 - 答案是编译器优化

编译器将其视为const int k = 1;编译时常量,并假设k永远不会更改值(确实如此!)。当编译器看到时cout << *pk << ' ' << k;,允许在编译时用调用站点处的k值替换,因此无论您在运行时做什么,您都在真正执行。但是,由于这是您获取地址的编译时常量,因此它必须存储在内存中,并且编译器可以自由(并且可能会)将该值存储在只读内存中。在运行时更改此类内存可能会使您的应用程序崩溃,但这并不能保证1cout << *pk << ' ' << 1;k k