C语言 局部函数里指针地址赋给另一个指针没有作用

BiTree *DeleteBST(BiTree *root,TypeData key)
{
BiTree *p,*tmp;
BiTree *parent=NULL;

p=root;
while(p)
{
if(p->data==key)
{
break;
}
parent=p;
p=(key<p->data)?p->lchild:p->rchild;
}
if(!p)
{
return NULL;
}
tmp=p;
f(!root->rchild)
{
p=p->lchild;
if(!parent)
{
root=p; // 已赋值,但返回主函数没有作用
}
else if(tmp==parent->lchild)
{
parent->lchild=p;
}
else
{
parent->rchild=p;
}
free(tmp);
}

return root;
二叉排序树已经建立,但输入 5 4 3 2 1 ,然后删除元素5时出错。调试发现是
if(!parent)
{
root=p; /
}
这里出错。修改是修改好了,但不明白为什么将指针p赋给指针root后返回主函数后就没有作用。

当然没有作用。指针作为形参时也只是拷贝了实参的“值”,所以对指针本身的改变不是永久性的。追问

问下,*root是传地址还是传值

追答

不是*root而是root。传的是地址,但地址也是拷贝。在C中,所有函数调用都是传值,即拷贝。只有把变量的地址传给函数,在函数中“通过指针(变量的地址)操作它指向的目标变量“才可以得到变量(不是指针)的永久性改变。不要以为传了指针,在函数中改变指针也能使实参指针发生改变,那是极大的误会,形参指针永远只是实参指针的拷贝。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-10-04
必须用双重指针 BiTree *DeleteBST(BiTree **root,TypeData key)追问

**root指向哪