单链表作为形参时,&与*的区别

&和*的大致比较

int a=10; int *b=&a; (设a的地址是3000)

a=10,&a=3000;b=3000;*b=10;

&取地址运算符。目的是值的引用,即实参和形参一样,对形参进行修改就会影响到实参;

*指针运算符。目的是地址的传递,传递后实参,形参指向同一地址;

正常数值当作形参传入函数时

                        

两图做对比,图一中形参a,b和图二中*a,*b类似,都几乎等于实参,所以改变传入的值就会影响实参。

因此都能交换a和b的值。

将链表头结点作为形参传入函数时

下面两张图分别两种方式穿参,第一张图中无遍历链表,第二张图片有

修改地方:第一张的void CreateList(LNode* head, int n)改为了void CreateList(LNode* &head, int n)

图一是值传递,图二为引用传递。

为什么第二张不能正常运行呢?

两张图从CreatrList()函数代码分析来看,两个形参head最后都指向了链表的尾节点。

但是图一依旧能够使用实参head进行遍历,而图二却不行。如下图

设刚传入值时实参head和形参head地址都是A。

经过函数后:图一的形参到了F处,但是图一的实参还是在A处(还处于头结点处);

                      图二的形参也到了F处,但是图二的实参也随形参改变到了F处(尾结点);

因此遍历的时候图二情况实参head已经不是头结点了。

所以若要用引用传递的方式传参,需要在函数中新定义一个结点来代替头结点head,防止由于形参head改变而导致了实参head的改变。此时实参形参一样。

猜你喜欢

转载自blog.csdn.net/qq_46423166/article/details/105256138
今日推荐