我正在做一个初学者(!)练习。
我很乐意传递基本变量并使用&变量参数,这样我就可以对返回时未被破坏的变量进行更改。但我还在学习指针。我正在进行基本的突变兔子练习(链表练习)。
在其中我通过声明Class Bunny来创建链接列表。我按照您的预期设置了数据部分和用于设置链接的“下一个”指针。
struct Bunny {
string name;
int age;
// more variables here
Bunny* next;
};
当我使用函数调用函数来创建Bunnies时,一切都很有效:
Bunny* add_node ( Bunny* in_root ){}
这会设置节点并按我想要的方式返回它。我也可以做一些事情,比如调用一个函数来修改Bunny类,就像老化兔子一样。
void advanceAge ( Bunny* in_root ){}
我传入头部,然后我可以修改被调用函数中的兔子,即使它回到主要部分也会保持修改。例如,我可以使用:
in_root->age ++;
在被调用的函数中,当我返回'main'时它仍然被改变了。基本上我可以使用 - >在任何被调用的函数中,它会永久地进行更改。我认为因为指针被 - >取消引用(?)但仍然围绕着它...
到目前为止一切顺利。
当我想要调用函数来删除列表时,问题出现了。 (核选择......不再是兔子)
我可以删除被调用函数中的所有节点...但它不会改变'main'中的Bunny。例如......这不会永久删除节点。
void DeathCheck(Bunny* in_root){
Bunny* prev_ptr;
prev_ptr = in_root;
if (prev_ptr == NULL){
cout << "No list to check age." << endl; return;
} else {
prev_ptr = NULL; // <- what could I code to have this stick? return;}
// rest of DeathCheck
我很好奇是否有办法在被调用的函数中将节点设置为NULL并让它坚持下去?
答案 0 :(得分:1)
由于您按值传递in_root
,因此无法修改来电者的变量。你可以通过引用传递它。
void DeathCheck(Bunny* &in_root) {
Bunny *prev_ptr = in_root;
...
in_root = nullptr;
return;
}
答案 1 :(得分:0)
目前,在DeathCheck(Bunny* in_root)
中,无法更改in_root
,只能更改其指向的对象。 (见pass by reference and value with pointers)。基于此,您需要将参数更改为传递引用,例如通过将函数的签名更改为:
DeathCheck(Bunny* &in_root)
{
//...
}
这会通过引用传递Bunny
,这意味着它现在可以在没有副本的情况下重新分配。