2021.10.09更新
简单说,引用参数传递地址,也就是内存块的逻辑地址,直接对内存地址里的内容进行修改和赋值会直接改变其内存块里的内容,函数运行完成后修改依然有效。
指针参数传递指针变量,仍然是一个变量,在函数压栈的时候创建一个新的空间,是深复制,创建出来的新变量无论怎么修改,函数一旦弹出栈,内存被释放,被修改的值就不复存在,存储旧值的空间里面依然存储着旧值。
-----------------------------------------------------------------------------------------------
以下是原文:
这个问题是在写平衡树的时候遇见的,到网上看了很多,也没明白,自己尝试了举一些例子来对比,终于明白了。
一言以蔽之:如果想改变一般类型的参数的值,可以使用变量的指针做参数;如果想改变指针变量指向的地址就要用引用参数。
先介绍一下问题产生的原因:
在AVL树的函数操作里,需要返回的改变较多,所以无法定义返回值函数,只能定义含参函数通过对参数的改变对树进行维护。
这里大家想到的肯定是指针和引用。
因为我不熟悉引用,所以自觉地使用了指针参数(嘲讽脸),发现事情并不是那么简单,指针参数并没有对我的函数操作进行传回
,只传回了部分改变。
这有点出乎意料,于是写了一个非常熟悉的Swap函数利用指针参数做交换,发现没问题
指针还是可以对变量进行交换的。
于是自己手动建了 一棵树,只进行右旋操作。
void R_Rotate(BSTree T) {
BSTree lc = T->lchild;
T->lchild = lc->rchild;
lc->rchild = T;
T = lc;
return;
}
右旋之后进行层序遍历只能输出 A E C
说明只有在对T = lc 的赋值失败了;
那么T = lc 的赋值和MySwap的赋值有什么不同呢?发现了问题!
MySwap赋值的是int类型的值,而T = lc 赋值的是地址。
T 虽然是指针可以指向地址,但是如果对指向地址的变量赋值就如同对于int 型参数赋值int值一样无法传回。
指针是一个实体,而引用仅是个别名;
使用引用的话,可以直接对引用的变量进行改变。