【问题标题】:pointer problems with function calls函数调用的指针问题
【发布时间】:2017-01-09 23:26:18
【问题描述】:

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

我很乐意传递基本变量并使用 &variable 参数,因此我可以对返回时不被破坏的变量进行更改。但我仍在学习指针。我正在做基本的 Mutant Bunny 练习(链表练习)。

在其中,我通过声明 Class Bunny 创建了一个链表。我按照您的预期使用数据部分和“下一个”指针进行设置,用于设置链接。

struct Bunny {
    string name;
    int age;
    // more variables here
    Bunny* next;
};

当我调用函数来执行诸如使用函数创建兔子之类的事情时,一切都很好:

Bunny* add_node ( Bunny* in_root ){}

这会设置节点并按照我的意愿返回它。我还可以做一些事情,比如调用一个函数来修改兔子类,比如老化兔子。

void advanceAge ( Bunny* in_root ){}

我传入头部,然后我可以修改被调用函数中的兔子,即使它返回主函数,它也会保持修改状态。例如我可以使用:

in_root->age ++; 

在被调用的函数中,当我返回“main”时,它仍然会改变。基本上我可以在任何被调用的函数中使用 -> 并且它会永久地进行更改。我认为是因为指针被 -> 取消引用(?),但我仍然在思考它......

到目前为止一切顺利。

当我想调用一个函数来删除列表时,问题就出现了。 (核选项......没有更多的兔子)

我可以删除被调用函数中的所有节点......但它不会改变'main'中的兔子。例如……这不会永久删除节点。

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 并保持不变?

【问题讨论】:

  • 您需要提供更多详细信息。 add_node() 究竟是如何工作的。以及完整的兔子列表存储在哪里以及如何存储。在 add_node() 中,您可能没有做您认为您正在做的事情。

标签: c++


【解决方案1】:

由于您通过值传递in_root,因此它无法修改调用者的变量。您可以通过引用传递它。

void DeathCheck(Bunny* &in_root) {
    Bunny *prev_ptr = in_root;
    ...
    in_root = nullptr;
    return;
}

【讨论】:

    【解决方案2】:

    目前,在DeathCheck(Bunny* in_root) 中,in_root 无法更改,只能更改它指向的对象。 (见pass by reference and value with pointers)。基于此,您需要将参数更改为传递引用,例如将函数的签名更改为:

    DeathCheck(Bunny* &in_root) 
    {
        //...
    }
    

    这通过引用传递Bunny,这意味着它现在可以在没有副本的情况下重新分配。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-11
      • 1970-01-01
      • 2016-05-31
      • 2016-07-31
      • 1970-01-01
      • 1970-01-01
      • 2014-02-22
      相关资源
      最近更新 更多