我想知道内部发生了什么以及它与显示的值的关系。 代码是:
# 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?
答案 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