二叉树建立,指针问题

我们对二叉树建立, 一般使用的方法是递归建立,这样的代码量最小,也最容易理解,但是这会牵扯到修改指针的值的问题,在看书中源码之时,我一直不太理解那段代码:

typedef struct BiTNode
{
       TElemType data;
       struct BiTNode *lchild, *rchild;
} BiTNode, *BiTree;

void CreateBiTree(BiTree* T)                   //传入的是指向指针的指针
{
        TElemType ch;
        scanf("%c",&ch);
        if(ch == #')
        {
              *T = NULL;
        }
        else
        {
              *T = (BiTree )malloc( sizeof(BiTNode));
              (*T)->data = ch;
              CreateBiTree(&(*T)->lchild);
              CreateBiTree(&(*T)->rchild);
        }
}

我一直很好奇,为什么我需要在这个递归建立二叉树的函数中传入指针的指针,因为我认为,我只需要传入节点的孩子就可以了,不需要传入指向孩子的指针。

所以,很荣幸,程序马上就崩溃了,我经历过反复调试,才发现,原来节点的左右孩子指针完全没有改变,这时我才明白,为什么需要传入指向指针的指针,原来我需要在函数中改变指针的值,也就是对指针进行重新赋值,并且这个副作用需要影响到实参

这个程序加深了我对指针这个概念的理解,本身我对于指针的理解就是通过指针我可以改变指针指向的元素的值,而对于指针的指针我并不熟悉,因为我不清楚这个到底是需要使用在哪里。

如果你需要在函数中修改指针的值,而不是指针指向的元素的值,那么这个指针对于你来说就是一个元素,你在函数中获得的这个指针是原来指针的副本,只是指向同一个地址,所以你可以借助这个副本指针去修改实参中的值,但是你直接修改指针的值(改变指针指向的地址)是无法对实参产生影响的,因为他只是个副本指针

所以你想通过函数对指针的值进行修改,在C++中有下面两种做法:

void function1(int ** p)
{
//这里传入的是指向指针的指针
       (*p) = new int(5);          //修改指针指向的地址
}

void function2(int* (&p))
{
//这里传入的是指针的引用
        p = new int(5);            //通过引用与指针绑定,直接修改指针的值
}

在自行编写过树的代码后,我才意识的一句话,在C++中能使用引用的地方尽量使用引用。我们若是想使用指针来修改元素值,那么我们需要确定元素的实际地址才行,因为函数中传递进去只是实参的副本,而引用为我们提供了一种简便的方法,直接将实参与形参绑定,这样我们就可以直接修改形参来影响到实参。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy阅读 9,676评论 1 51
  • 指针是C语言中广泛使用的一种数据类型。 运用指针编程是C语言最主要的风格之一。利用指针变量可以表示各种数据结构; ...
    朱森阅读 3,615评论 3 44
  • 指针 指针是什么 为了了解指针的概念,我们先来看一个小故事。话说福尔摩斯派华生到威尔爵士居住的城堡去取回一个重要的...
    去留无意hmy阅读 584评论 0 1
  • 理性与社交的取舍
    破之阅读 233评论 0 0
  • 一. finalize()基本概念 所谓的终结方法其实是指finalize()。终结方法finalizer通常是不...
    Ruheng阅读 3,067评论 3 3

友情链接更多精彩内容