用const_cast强制转换导致了解引用指针的值和常量值不匹配

代码如下

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;
}

输出如下:

img

发现 :
用一个底层const指针 pt 指向 i ,再将 pt 用const_cast强制转换成普通指针后对普通指针 p 初始化。
那么 p 实际上还是指向 i 的,因为 p 的值和 i 取地址的值以及pt的值是相同的(如图)
令人奇怪的是,给 *p 赋新的值结果是可行的,此时 p = 2
更令人奇怪的是 i 的值实际上没变,但是 p 指向的值是变的。
描述得不好请见谅,不知道是bug还是什么

i是常量,所以一直是0,int *p = const_cast<int *>(pt); 去除了const限定,所以 p 指向的值是变的