将指针传递给函数

Passing a pointer to a function

我试图使用 C++ 实现 BST,所以我尝试了这个:

    #include <iostream>
    #include <stdlib.h>
    struct node
    {
      int value;
      node* left;
      node* right;
    };

    void insert(node *cur , int val)
    {
      if(!cur)
      {
        cur = new node;
        cur->value = val;
        cur->left = NULL;
        cur->right = NULL;
        return;
      }

      if(val <= cur->value)
        insert(cur->left , val);
      else
        insert(cur->right , val);
    }

    using namespace std;

    int main()
    {
      node *root = NULL;


      insert(root , 20);
      insert(root , 21);

      cout<<(*root).value;

      return 0;
    }

但是我有一个问题,我的 insert() 函数运行良好,但是 cur 中的变化似乎没有反映到 root 指针中,因为 root在 `insert() 函数调用后保持 NULL。这里有什么问题?

编辑:感谢您的所有回答,使指向指针的指针看起来既丑陋又乏味,是否有其他方法可以通过其他设计实现?

此处,root 本身已使用按值传递传递给 insert()。因此,从 insert() 开始,无法更改 root 的值。换句话说,curinsert() 函数的局部变量。对 cur 本身所做的任何更改都不会影响传递的实际参数。

如果要从insert()更改root的值,需要将指针从main()传递到root

要详细说明,您可以将 cur 指向的地址 的 值从 insert() 更改。所以,按照同样的类比,如果你改变

  1. insert(&root , 20);
  2. void insert(node **cur , int val)
  3. cur*cur
  4. 的所有出现次数

你应该一切顺利。

错误的是你按值传递了一个指针,改变了那个值但是调用者不知道。改成

void insert(node **cur , int val)
{
if(!*cur)
{
    *cur = new node;
    (*cur)->value = val;
    (*cur)->left = NULL;
    (*cur)->right = NULL;
    return;
}

if(val <= (*cur)->value)
    insert((*cur)->left , val);
else
    insert((*cur)->right , val);
}

并相应地更改函数调用(...练习!)

C++ 将函数调用作为按值调用。所以它复制了一个指针并将其传递给函数。如果你传递那个指针,你可以访问指针指向的数据,但不能访问函数本身之外的指针,因为只有指针指向的地址被复制。

如果你想修改指针本身(这将是 C 尝试)或通过引用传递,你需要传递一个指向指针的指针,c++ 可以做到这一点。

如果要使用C尝试:

void insert(node ** cur , int val)
if(!(*cur))
{
    (*cur) = new node;
    (*cur)->value = val;
    (*cur)->left = NULL;
    (*cur)->right = NULL;
    return;
}

或者C++的尝试(这里只需要修改cur的类型,其他不变):

void insert(node *& cur , int val)

如果您将 cur 重新分配给 insert 中的新节点,这并不意味着 root 被分配了该值(特别是 root 根本不是地址,而是 NULL)。

传递一个指向空节点的指针以在初始化时插入(并用相关数据更新它)或return一个新节点(并将其分配给 main 中的根)。

如果您希望函数在 outside 指针而不是 local copy 上操作,您需要通过引用传递:

void insert(node*& cur, int val)
{
    // ... 
}

否则该函数对指针的副本起作用并且外部变量保持不变。