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);
    }
    
    我是这耀眼的瞬间,是划过天边的刹那火焰。
  • 相关阅读:
    常用php操作redis命令整理(四)SET类型
    常用php操作redis命令整理(三)LIST类型
    常用php操作redis命令整理(二)哈希类型
    常用php操作redis命令整理(一)通用及字符串类型
    php时间戳函数mktime()
    Linux SSH远程文件/目录传输命令scp
    运行一个android程序,直接访问某个网站
    Android开发学习笔记:浅谈WebView
    Android 权限添加
    linux下使用vi操作
  • 原文地址:https://www.cnblogs.com/Rane/p/12916137.html
Copyright © 2011-2022 走看看