C++指针赋值疑问:为何secondvalue最终值为20而非10?
指针操作逐行解析与问题解答
我们把代码拆成每一步,跟踪变量和指针的状态变化,就能清楚理解最终结果:
初始状态
int firstvalue = 5, secondvalue = 15; int * p1, * p2;
firstvalue存储值:5,secondvalue存储值:15p1、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
相关产品推荐
相关产品推荐

