请解释以下代码
#include <iostream>
using namespace std;
int main()
{
const int x = 10;
int * ptr;
ptr = (int *)( &x ); //make the pointer to constant int*
*ptr = 8; //change the value of the constant using the pointer.
//here is the real surprising part
cout<<"x: "<<x<<endl; //prints 10, means value is not changed
cout<<"*ptr: "<<*ptr<<endl; //prints 8, means value is changed
cout<<"ptr: "<<(int)ptr<<endl; //prints some address lets say 0xfadc02
cout<<"&x: "<<(int)&x<<endl; //prints the same address, i.e. 0xfadc02
//This means that x resides at the same location ptr points to yet
//two different values are printed, I cant understand this.
return 0;
}
答案 0 :(得分:11)
*ptr = 8;
此行导致未定义的行为,因为您正在修改const
限定对象的值。一旦你有未定义的行为,任何事情都可能发生,并且无法推断该程序的行为。
答案 1 :(得分:6)
由于x
是const int
,编译器很可能会在您使用x
的位置直接替换您初始化的值(如果可能)。所以源代码中的行:
cout<<"x: "<<x<<endl;
将在编译时替换为
cout<<"x: "<<10<<endl;
这就是为什么你仍然看到10张印刷品。
但正如Charles所解释的那样,行为是未定义的,因此任何事情都可能发生在这样的代码上。