为什么这个函数应该被引用调用?
我有这样的(执行树)的一段代码为什么这个函数应该被引用调用?
struct Node
{
int val;
struct node* left,*right;
Node(int x){
val=x;
left=right=NULL;
}
};
void insert(Node* &h,int val){
if(h==NULL){
h=new Node(val);
return;
}
if(h->val > val){
insert(h->left,val);
}
else {
insert(h->right,val);
}
}
void temp(Node* h,int val){ // Node* h doesn't seem to work but
// Node*& h does!!!
insert(h,val);
}
int main() {
struct Node* R=NULL;
for(int i=0;i<5;i++){
cin>>x;
temp(R,x);
}
return 0;
}
请忽略小错误和其他形式,包括图书馆(这个代码不编译)。
我的问题是: - 为什么地址需要在提到的行中通过引用传递?
我的观点:我从主发送根的地址临时函数,然后临时功能由发送该地址插入功能参考插入它通过永久那么为什么不改变它的功能根源地址在这里改变?如果这是一个错误,而不是哪个地址实际上在这里改变?
因为,否则参数将按值传递。因此,在temp()
/insert()
返回后,main的R
或任何树的根节点将保持完全不变。
如果它最初是NULL
,temp()
返回后它仍然是NULL
,即使假定插入了一个新节点作为根节点。发生的所有事情都是更新参数的值副本,而不是真正的根节点,从而泄漏内存。
但是在插入函数中通过引用参数传递怎么样!我在那里通过参考传递。那么它在发生什么变化? – Dofenshmirtz
它正在改变temp()中的'h'值。这就是它的参考。它不会改变main()中的'R'值,因为它被传递给temp(),并且temp()中的'h'参数被引用传递给insert(),所以insert()改变temp()的参数。大不了。 –
你是我的英雄 Dofenshmirtz
由于temp函数将h作为指针的引用,此程序将导致分段错误。
将临时函数的签名更改为void temp(Node* &h, int val)
,它将起作用。
插入函数分配存储器用于h但临时功能正在经过由编译器插入功能
内部创建的临时变量“按引用传递”是指该功能可以改变原始值。否则它不能。 –
是'traverse'应该是'temp' –
@ M.M对不起。编辑!!! – Dofenshmirtz