指针和引用作为函数参数的区别

这个问题是在写平衡树的时候遇见的,到网上看了很多,也没明白,自己尝试了举一些例子来对比,终于明白了。

 

一言以蔽之:如果想改变一般类型的参数的值,可以使用变量的指针做参数;如果想改变指针变量指向的地址就要用引用参数。

 

先介绍一下问题产生的原因:

在AVL树的函数操作里,需要返回的改变较多,所以无法定义返回值函数,只能定义含参函数通过对参数的改变对树进行维护。

这里大家想到的肯定是指针和引用。

因为我不熟悉引用,所以自觉地使用了指针参数(嘲讽脸),发现事情并不是那么简单,指针参数并没有对我的函数操作进行传回

,只传回了部分改变。

 

这有点出乎意料,于是写了一个非常熟悉的Swap函数利用指针参数做交换,发现没问题

指针和引用作为函数参数的区别_第1张图片 

指针还是可以对变量进行交换的。

于是自己手动建了 一棵树,只进行右旋操作。

void R_Rotate(BSTree  T) {
    BSTree lc = T->lchild;
    T->lchild = lc->rchild;
    lc->rchild = T;
    T = lc;
    return;
}

指针和引用作为函数参数的区别_第2张图片

右旋之后进行层序遍历只能输出  A    E    C  

说明只有在对T = lc 的赋值失败了;

那么T = lc 的赋值和MySwap的赋值有什么不同呢?发现了问题!

MySwap赋值的是int类型的值,而T = lc 赋值的是地址。

T 虽然是指针可以指向地址,但是如果对指向地址的变量赋值就如同对于int 型参数赋值int值一样无法传回。

 指针是一个实体,而引用仅是个别名;

使用引用的话,可以直接对引用的变量进行改变。

 

你可能感兴趣的:(MyEffective,CPP)