指向c ++中的const int的指针

nra*_*adk 5 c++ pointers

当我在c ++中学习const变量时,我尝试了这个:

#include <iostream>

int main()
{
    const int p = 20;

    int* a = const_cast<int*>(&p);

    *a = 10;

    std::cout<<"Value at a: "<<(*a)<<std::endl;
    std::cout<<"Value of p: "<<p<<std::endl;

    std::cout<<"Their addresses : "<<std::endl;
    std::cout<<a<<" "<<&p<<std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它产生输出:

Value at a: 10
Value of p: 20
Their addresses : 
0x7fff4646d7d4 0x7fff4646d7d4
Run Code Online (Sandbox Code Playgroud)

似乎我将值10赋值给p的内存地址,但它们的值不同.为什么会这样?

Jos*_*eld 9

尝试修改最初声明的对象const会给您带来未定义的行为.

§7.1.6.1/ 4 [dcl.type.cv]除了mutable可以修改声明的任何类成员之外,任何const在其生命周期内修改对象的尝试都会导致未定义的行为.

有可能,你的编译器正在用p代值替换代码中的所有出现20,因为你已经承诺它不会改变.所以打印的行p已更改为:

std::cout<<"Value of p: "<<20<<std::endl;
Run Code Online (Sandbox Code Playgroud)

因此20无论您是否修改了原始对象,它都会打印出来.当然,由于您有未定义的行为,这种推理是徒劳的,您不应该在程序中调用未定义的行为.