//创建二叉链表存储的二叉树
void CreateBiTree(BiTree *T) {//传入指针的指针
//以下的*T均为解引用,即*T为原始指针的内容
char chars;
scanf("%c",&chars);
if (chars == '#') {
*T = NULL;//为空树
} else {
*T = (Node*)malloc(sizeof(Node));
(*T)->data = chars;
//注意!再次传入时仍然应该是指针的指针
CreateBiTree(&(*T)->lchild);//创建左子树
CreateBiTree(&(*T)->rchild);//创建右子树
}
}
以上为创建二叉树的代码。本人对此种参数传递困惑,经过学习得到以下结论。
在传参时我是这样定义的:BiTree T; CreateBiTree(&T);
因为本函数的参数为BiTree *T,即为指针的指针。因此传入函数的是指向指针T的另一个指针T,该指针T内存放了原始指针T的地址。
进入函数后,会对*T进行重新赋值的操作,而此处的*T是对指针的指针的解引用,即*T为原始的指针T。因此一切操作都是在对原始的指针所指向的内存进行操作。注意啦!在递归调用该函数创建左子树和右子树时,仍要传入指针的指针作为参数。如果传入的是(*T)->lchild,则修改的仅仅是该参数的一个指针副本,为局部变量,会在函数运行结束后自动释放内存。而不会改变原始二叉树的结构。
总结:当使用指针作为函数的参数时,则传入的为该指针的指针副本,原始指针所指内存不会发生变化。