完整代码地址:
https://blog.csdn.net/2301_76819732/article/details/143807340?spm=1001.2014.3001.5502
如果使用L=s; 的话,当输出结果时,会发现内容为空。
我感到很奇怪,按照我的设想,L=s;
会把s指向的地址赋给L。
但现在这个情况肯定是失败的了。
我随便试了一试,发现如果是换成*L=*s;
是成功的,这很奇怪,因为在我看来使用*
一般是值传递;于是我使用test()函数
来显示L
和s
中的各个地址。
发现除了头节点不一样之外,其他的结点地址都是一样的,为什么会这样嘞?
我查了一些资料之后发现,如果是使用L=s;
的话,其实是将形参中的L
指向了s
,形参L
原本保存的是实参是的地址,在这之后变成了s保存的地址。这和实参L
没有任何关系。(不能以为传递指针后,形参和实参就是同一个东西了,要避免形参指针在局部函数里指向其他地址)
知道了L=s
失败的原因;那,为什么*L=*s
却可以实现嘞?
L
和s
都是一级结构体指针,使用*可以将整个解结构体复制过去,包括data、next、prior
;
data
是int类型的,而next和prior
同样都是结构体指针,保存的是地址,所以在值传递的时候传递的也是地址。L
在清空之后,L->data=0,L->next=NULL,L->prior=NULL;
在执行*L=*s
之后,L->data=s->data,L->next=s->next,L->prior=s->prior;
实参L和形参L保存的地址没有改变,修改的是实参中保存的值;而且,此时L和s所指向的是同一个双向链表,只不过头节点有两个。
最后还要注意将s的头节点释放。