将指针传递给函数

时间:2015-05-23 13:53:35

标签: c++ function pointers pass-by-value

我试图用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()函数调用之后{1}}。这有什么不对?

编辑:感谢您的所有答案,指针指针似乎是丑陋和乏味的,有没有其他方法,用其他设计实现这一点?

5 个答案:

答案 0 :(得分:1)

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

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

要详细说明,您可以更改curinsert()指向的地址处的值。所以,按照同样的比喻,如果你改变

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

    你应该好好去。

答案 1 :(得分:0)

错误的是您按值传递指针,更改该值但调用者不知道它。将其更改为

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);
}

相应地更改函数调用(...运动!)

答案 2 :(得分:0)

C ++使函数调用成为Call by Value。所以它制作指针的副本并将其传递给函数。如果传递该指针,则可以访问指针指向的数据,但不能访问函数本身外部的指针,因为只复制指针所指向的地址。

如果你想修改指针本身(可能是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)

答案 3 :(得分:0)

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

将指针传递给空节点以在初始化时插入(并使用相关数据更新)或返回新节点(并将其分配给main中的root)。

答案 4 :(得分:0)

如果您希望该功能在外部指针而不是本地副本上运行,则需要通过引用传递:

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

否则该函数适用于指针的副本外部变量保持不变。