zoukankan      html  css  js  c++  java
  • * 和 *& 在参数传递中的区别——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);
    }
    
    我是这耀眼的瞬间,是划过天边的刹那火焰。
  • 相关阅读:
    初试kafka消息队列中间件一 (只适合初学者哈)
    3月22日 html(三)css样式表
    3月20日html(二) 图片热点,网页划分,表单
    3月19日 html(一) html基础内容
    3月18日 全部练习题(一)
    3月18日 全部练习题(二)
    3月15日
    3月13日 函数
    3月13日 冒泡排序
    3月12日 数组
  • 原文地址:https://www.cnblogs.com/Rane/p/12916137.html
Copyright © 2011-2022 走看看