FromHiphop 2021-09-27 10:45 采纳率: 50%
浏览 16
已结题

用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还是什么

  • 写回答

1条回答 默认 最新

  • 关注

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 10月7日
  • 已采纳回答 9月29日
  • 创建了问题 9月27日

悬赏问题

  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改