函数调用指针问题

时间:2016-09-01 23:39:27

标签: c++

我正在做一个初学者(!)练习。

我很乐意传递基本变量并使用&变量参数,这样我就可以对返回时未被破坏的变量进行更改。但我还在学习指针。我正在进行基本的突变兔子练习(链表练习)。

在其中我通过声明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并让它坚持下去?

2 个答案:

答案 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,这意味着它现在可以在没有副本的情况下重新分配。