* 和 *& 在参数传递中的区别——C++

最近在进行前序插入构造二叉树时被 * 和 *& 绊了一下。先贴错误代码:

#include<cstdlib>
#include<iostream>
using namespace std;

typedef char Elemtype;
typedef enum {link, thread} PointerTag;

typedef struct Node{
    Elemtype data;
    PointerTag ltag;
    PointerTag rtag;
    struct Node *lchild=nullptr;
    struct Node *rchild=nullptr;
}BinaryTreeNode, *BinaryTreeNodePtr;

//前序插入构造二叉树
// "#" means NULL;
void CreateBinaryTree_PreOrder(BinaryTreeNode *T){
    Elemtype temp;
    cin>>temp;
    if(temp == '#'){
        T = nullptr;
        return ;
    }else{
        T = (BinaryTreeNodePtr)malloc(sizeof(BinaryTreeNode));
        T->data = temp;
    }
    CreateBinaryTree_PreOrder(T->lchild);
    CreateBinaryTree_PreOrder(T->rchild);
}
int main(){
    BinaryTreeNode *T = (BinaryTreeNodePtr)malloc(sizeof(BinaryTreeNode));
    CreateBinaryTree_PreOrder(T);
    cout<<endl;
    return 0;
}

第十八行的形参是 * T,为指向T的一个指针,main函数中调用时,将指针T传入,malloc() 函数申请的内存会在该函数结束时全部释放。这相当于没有二叉树没有进行构造。这是因为形参是一个传值引用,* T会对传入参数进行复制。因此,该函数运行结束后,只能改变传入指针指向的值,并不能改变该指针的指向。

若将形参变为BinaryTreeNode *&T ,即指针的引用,就可以改变传入指针的指向或是指针指向的值。具体代码如下:

void CreateBinaryTree_PreOrder(BinaryTreeNode *&T){
    Elemtype temp;
    cin>>temp;
    if(temp == '#'){
        T = nullptr;
        return ;
    }else{
        T = (BinaryTreeNodePtr)malloc(sizeof(BinaryTreeNode));
        T->data = temp;
    }
    CreateBinaryTree_PreOrder(T->lchild);
    CreateBinaryTree_PreOrder(T->rchild);
}
上一篇:关于 Rails 生成 PDF 时,markdown 中的图片链接如何处理


下一篇:【剑指Offer-07】重建二叉树