C++二级指针是否自动获取新值?代码场景下的理解困惑求助
你的二级指针理解误区解析
首先咱们先把你的代码逻辑理清楚,这样更容易找到问题所在:
你定义的类型和结构拆解后是这样的:
objectPtr本质是object*(一级指针,指向object实例)RandomStruct里的objOwner是objectPtr*,也就是 **object**(二级指针,指向的是一个object*类型的变量)- 在构造函数里,你把
&objectPtrMember传给了RandomStructMember,所以objOwner保存的是objectPtrMember这个成员变量本身在内存中的地址,而不是objectPtrMember指向的对象地址。
你误解的核心点
你以为更新objectPtrMember指向新对象后,objOwner会变成新对象的地址,但实际上:
objOwner的值从始至终都是objectPtrMember的内存地址,这个值不会变(除非你主动修改objOwner本身)- 真正会和
objectPtrMember同步更新的是*objOwner——也就是objOwner指向的内容,也就是objectPtrMember的当前值。
举个直观的内存例子帮你理解:
- 假设
objectPtrMember在内存中的位置是0x1234,初始值是NULL(0x0000) RandomStructMember.objOwner的值是0x1234(因为你传入了&objectPtrMember)- 当你把
objectPtrMember更新为指向某个object实例(比如地址0x5678),此时:objOwner的值还是0x1234(它始终指向objectPtrMember的位置)*objOwner的值变成了0x5678,和objectPtrMember完全一致
你可能犯的操作错误
你大概率是直接打印了objOwner的值(比如调试时查看objOwner),看到它还是原来的地址,就误以为没更新。但正确的查看方式应该是看*objOwner,它才会和objectPtrMember同步变化。
举个验证代码的例子:
// 在更新objectPtrMember之后 cout << "objectPtrMember 当前指向的地址: " << objectPtrMember << endl; cout << "objOwner 本身的值(指向objectPtrMember的地址): " << RandomStructMember.objOwner << endl; cout << "*objOwner 的值(和objectPtrMember一致): " << *(RandomStructMember.objOwner) << endl;
运行这段代码你会发现,第三行的输出和第一行完全相同,这就说明二级指针的同步逻辑是正常的。
总结
你的操作本身没有错误,问题出在对二级指针的层级理解上:二级指针保存的是一级指针变量的地址,而不是一级指针指向的对象地址。要跟踪一级指针的变化,需要通过解引用二级指针(*objOwner)来获取,而不是直接查看二级指针本身的值。
内容的提问来源于stack exchange,提问作者raiskader
相关产品推荐
相关产品推荐

