C++中无法通过临时指针修改目标指针值的技术问题
问题原因及解决方法
问题原因
- 当
i=1或i=2时,x = me/x = con是把me/con的当前值(nullptr)拷贝给临时指针x,后续x = new A这类操作只是修改了x自己的指向,和原始的me/con没有任何关联,自然无法改变它们的值。 - 当
i=0时,x = &ba是让x指向ba这个指针变量(此时x的类型是LOAI**),但后续x = new A是把LOAI*类型的地址赋值给LOAI**类型的x,这属于类型不匹配的错误,编译器应该会给出警告或报错;就算强行编译,也只是修改了x本身的存储值,并没有修改ba的指向。
解决方法
要修改原始指针的指向,需要通过指针的指针或者指针的引用来操作,以下是两种可行方案:
方案1:使用指针的指针(LOAI**)
LOAI* ba = nullptr; LOAI* me = nullptr; LOAI* con = nullptr; for (int i = 0; i < 3; ++i) { LOAI** x = nullptr; if (i == 0) x = &ba; else if (i == 1) x = &me; else if (i == 2) x = &con; int loai; cin >> loai; if (loai == 1) *x = new A; else if (loai == 2) *x = new B; else if (loai == 3) *x = new AB; else if (loai == 4) *x = new O; }
这里x是指向原始指针的指针,通过*x就能直接修改ba/me/con的指向。
方案2:使用指针的引用(LOAI*&)
LOAI* ba = nullptr; LOAI* me = nullptr; LOAI* con = nullptr; for (int i = 0; i < 3; ++i) { LOAI*& x = (i == 0) ? ba : (i == 1) ? me : con; int loai; cin >> loai; if (loai == 1) x = new A; else if (loai == 2) x = new B; else if (loai == 3) x = new AB; else if (loai == 4) x = new O; }
这里x是原始指针的引用,对x的赋值直接等价于对ba/me/con的赋值,逻辑更直观。
注意:使用
new分配内存后,记得在合适的地方用delete释放,避免内存泄漏。
内容的提问来源于stack exchange,提问作者KhiTuKi
相关产品推荐
相关产品推荐

