将指针传递给函数
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
的值。换句话说,cur
是 insert()
函数的局部变量。对 cur
本身所做的任何更改都不会影响传递的实际参数。
如果要从insert()
更改root
的值,需要将指针从main()
传递到root
。
要详细说明,您可以将 cur
指向的地址 的 值从 insert()
更改。所以,按照同样的类比,如果你改变
insert(&root , 20);
void insert(node **cur , int val)
cur
到 *cur
的所有出现次数
你应该一切顺利。
错误的是你按值传递了一个指针,改变了那个值但是调用者不知道。改成
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)
{
// ...
}
否则该函数对指针的副本起作用并且外部变量保持不变。
我试图使用 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
的值。换句话说,cur
是 insert()
函数的局部变量。对 cur
本身所做的任何更改都不会影响传递的实际参数。
如果要从insert()
更改root
的值,需要将指针从main()
传递到root
。
要详细说明,您可以将 cur
指向的地址 的 值从 insert()
更改。所以,按照同样的类比,如果你改变
insert(&root , 20);
void insert(node **cur , int val)
cur
到*cur
的所有出现次数
你应该一切顺利。
错误的是你按值传递了一个指针,改变了那个值但是调用者不知道。改成
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)
{
// ...
}
否则该函数对指针的副本起作用并且外部变量保持不变。