整数指针指向常量整数

时间:2014-02-04 22:40:07

标签: c++

我想知道内部发生了什么以及它与显示的值的关系。 代码是:

# include <iostream>

int main(){
    using namespace std;
    const int a = 10;

    int* p = &a;  //When compiling it generates warning "initialization from int* to 
              //const int* discard const -- but no error is generated

    cout << &a <<"\t" << p <<endl; //output: 0x246ff08 0x246ff08 (same values)
    cout << a << "\t" << *p << endl; //output: 10 10

    //Now..
    *p = 11;
    cout << &a <<"\t" << p <<endl; //output: 0x246ff08 0x246ff08 (essentially, 
                               //same values and same as above, but..)
    cout << a << "\t" << *p << endl; //output: 10 11

    return 0;
}

问题:如果p = address-of-a,a = 10,但是* p =(a的地址和内存位置的读取值)= 11?

4 个答案:

答案 0 :(得分:8)

 cout << a << "\t" << *p << endl; //output: 10 11

你骗了编译器并报了仇。

使用:

const int a = 10;

你答应过你永远不会修改a对象。

答案 1 :(得分:5)

你答应不修改a,编译器相信你。因此它决定优化a的读数,因为它信任你。你违背了诺言。

话虽如此,真正的C ++编译器不会编译您的代码,因为int* p = &a是非法的。所以也许你也在欺骗我们。或许你需要一个真正的C ++编译器。

答案 2 :(得分:2)

就像Ouah说编译器已经报复了

但我不同意你的说法,它没有给出任何错误

const int a = 10;

int* p = &a;

您不能将常量赋给非常量指针。

答案 3 :(得分:0)

在C中,这是undefined behavior。在C ++中,这不会编译。它被David Heffernan多次重复,但值得重复。这是你应该在现代编译器上得到的错误:

main.cpp:7:10: error: cannot initialize a variable of type 'int *' with an rvalue of type 'const int *'

    int* p = &a;  //When compiling it generates warning "initialization from int* to