代码如下
int main()
{
const int i = 0;
const int *pt = &i;
int *p = const_cast<int *>(pt); //p还是指向 i
*p = 2; //疑点:给 *p 赋值,实际上是给 i 赋值,但是 i 是常量
cout << "pt = " << pt << endl;
cout << "p = " << p << endl; //输出两个指针的值,看一下pt的地址是否真的赋给了p
cout << "i = " << i << endl; //输出 i 的值, 观察它是否也变成了 2,结果没变
cout << "*pt = " << *pt << endl; //输出 *pt的值,结果变成了2
cout << "*p = " << *p << endl; //产生新的疑问:p 和pt 是否真的指向了 i
cout << "&i = " << &i << endl; //取 i 的地址,结果和p 、pt相同
const int *pi = &i;
cout << "*pi = " << *pi << endl; //声明一个新的const指针指向 i,他指向的值也是 2
int a = i; //那……再声明一个新的变量
cout << "a = i = " << a << endl; //我就不信了,结果输出
system("pause");
return 0;
}
输出如下:
发现 :
用一个底层const指针 pt 指向 i ,再将 pt 用const_cast强制转换成普通指针后对普通指针 p 初始化。
那么 p 实际上还是指向 i 的,因为 p 的值和 i 取地址的值以及pt的值是相同的(如图)
令人奇怪的是,给 *p 赋新的值结果是可行的,此时 p = 2
更令人奇怪的是 i 的值实际上没变,但是 p 指向的值是变的。
描述得不好请见谅,不知道是bug还是什么