• * 和 *& 在参数传递中的区别——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);
    }
    
    我是这耀眼的瞬间,是划过天边的刹那火焰。
  • 相关阅读:
    24节气冬至
    最佳人体舒适温度是多少?
    常用正则
    点击按钮后的Loading处理
    支付时过渡动画
    npm ci 和 npm install
    Vue批量上传文件及实时进度
    HTML DOM classList 属性的使用
    Electron Uncaught ReferenceError: require is not defined
    javascript 深拷贝的问题
  • 原文地址:https://www.cnblogs.com/Rane/p/12916137.html
Copyright © 2020-2023  润新知