返回指针引用后无法修改类内原指针指向的技术问题咨询
问题分析与解决
咱们一步步拆解你遇到的问题,帮你搞清楚为啥预期和实际结果不符:
1. 先修正初始化的错误
你类里的int * ptr = 5;是典型的错误写法——这里是把整数5直接赋值给指针变量,相当于让ptr指向内存地址为5的非法区域。正确的做法是让它指向一个有效的int对象,比如:
private: int val = 5; int * ptr = &val; // 指向类内的int成员 // 或者用动态分配(记得后续释放内存) // int * ptr = new int(5);
2. 成员函数调用的问题
main函数里直接写int * ptrTwo = foo();是行不通的,foo()是someClass的成员函数,必须通过类的实例对象来调用,比如:
int main() { someClass obj; // 先创建类的对象 // 后续操作都基于这个obj return 0; }
3. 核心问题:没拿到指针的引用
这才是你预期落空的关键:
当你写int * ptrTwo = obj.foo();时,ptrTwo是一个普通的指针变量,它只是把foo()返回的引用所指向的ptr的值(也就是指针存储的地址)拷贝了一份过来。这时候ptrTwo和类里的ptr完全是两个独立的变量,修改ptrTwo = NULL;只会改变这个副本,自然碰不到类里的原指针。
如果想让ptrTwo成为类内ptr的“别名”,从而能修改它的指向,你需要把ptrTwo声明为指针的引用,也就是:
int *& ptrTwo = obj.foo(); // 现在ptrTwo就是类内ptr的引用 ptrTwo = NULL; // 这时候修改的就是类里的ptr了
修正后的完整代码示例
class someClass { public: int *& foo(); private: int val = 5; int * ptr = &val; }; int *& someClass::foo() { return ptr; } int main() { someClass obj; int *& ptrTwo = obj.foo(); ptrTwo = NULL; // 此时类内的ptr会被修改为NULL return 0; }
这样运行后,就完全符合你的预期啦。
内容的提问来源于stack exchange,提问作者csStudent
相关产品推荐
相关产品推荐

