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

时间:2014-02-02 10:33:20

标签: 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;
}

并产生输出:

Value at a: 10
Value of p: 20
Their addresses : 
0x7fff4646d7d4 0x7fff4646d7d4

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

1 个答案:

答案 0 :(得分:9)

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

  

§7.1.6.1/ 4 [dcl.type.cv] 除了可以修改任何声明为mutable的类成员外,任何修改const对象的尝试都会被修改它的生命周期导致不确定的行为。

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

std::cout<<"Value of p: "<<20<<std::endl;

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