You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++指针赋值疑问:为何secondvalue最终值为20而非10?

指针操作逐行解析与问题解答

我们把代码拆成每一步,跟踪变量和指针的状态变化,就能清楚理解最终结果:

初始状态

int firstvalue = 5, secondvalue = 15;
int * p1, * p2;
  • firstvalue 存储值:5,secondvalue 存储值:15
  • p1、p2 是未初始化的指针,还没指向任何内存地址

步骤1:给指针分配指向地址

p1 = &firstvalue;  // p1 指向 firstvalue 的内存地址
p2 = &secondvalue; // p2 指向 secondvalue 的内存地址
  • 此时 *p1 等价于 firstvalue(值为5),*p2 等价于 secondvalue(值为15)

步骤2:通过p1修改firstvalue的值

*p1 = 10;
  • 这行代码是修改指针指向的变量的值:因为p1指向firstvalue,所以*p1=10直接把firstvalue改成了10
  • 当前状态:firstvalue=10,secondvalue=15,p1仍指向firstvalue,p2仍指向secondvalue

步骤3:把p1指向的值赋值给p2指向的变量

*p2 = *p1;
  • *p1 是当前firstvalue的值(10),*p2 是secondvalue的别名,所以这行把secondvalue改成了10
  • 当前状态:firstvalue=10,secondvalue=10,p1指向firstvalue,p2指向secondvalue

步骤4:修改p1的指向(关键!你可能忽略了这一步)

p1 = p2;
  • 这行是修改指针本身的指向,不是修改变量的值:把p2的地址赋值给p1,现在p1和p2指向同一个内存地址——也就是secondvalue的地址
  • 当前状态:p1、p2都指向secondvalue,firstvalue=10,secondvalue=10

步骤5:通过p1修改secondvalue的值

*p1 = 20;
  • 现在p1指向的是secondvalue的地址,所以*p1=20直接修改了secondvalue的值,变成20
  • 当前状态:firstvalue=10,secondvalue=20

最终输出

所以代码运行后输出:

firstvalue is 10
secondvalue is 20

你的困惑点在于只关注了*p2=*p1这一步(此时secondvalue确实变成10),但后续的p1=p2让p1转而指向secondvalue,最后*p1=20又修改了secondvalue的值,所以最终它是20。

内容的提问来源于stack exchange,提问作者said07

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 11:20:33