函数参数中有链表时,对&符号的理解与讨论
先说结论:
L和 副本L 本身的地址是一个存储自身的地方,二者不同,但是这两个变量所储存的地址都是链表的头节点,
因此可以可以通过修改副本l->next来修改原l头节点的指向,
但是如果想要改变头节点自身的地址,如果不加&符号,那就相当于修改了副本l所储存的地址,原l不受影响
关键点:不要错误的以为 函数中的l->next 是由副本l记录的,实际上这个是由头结点记录的,副本l指向的地址实际上是记录了头结点的地址
L 和副本 L 本身是存储地址的变量:
L和它的副本L是两个不同的指针变量,它们本身(即L和副本L)存在于不同的内存地址中。- 但是,它们存储的值是相同的,都存储了链表头节点的地址(比如说地址
3)。也就是说,无论是L还是副本L,它们指向的是同一个链表节点,这是链表头节点的地址。
2. L->next 是链表节点的成员:
L->next存储的是链表中下一个节点的地址。这个成员属于链表头节点,所以无论你是通过原始的L还是副本L来访问L->next,你修改的都是同一个链表节点的next成员。
3. **修改 L->next 会影响原始 L**:
- 因为
L和副本L都指向同一个链表节点(同一个头节点),所以**修改L->next(即修改头节点的next指向的地址)会同时影响原始L->next**。 - 这就是为什么你通过副本修改
L->next,原始的L也会“感知”到这个变化的原因,因为它们指向的节点是同一个。
4. **改变 L 本身(头节点的地址)需要 &**:
- 如果你想要改变的是
L本身(也就是想让L指向不同的地址,比如让L从指向头节点变成指向其他节点),那么不加&是不行的。因为如果不加&,传递的只是L的副本,修改的是副本的值,不会影响原始的L。 - 加上
&的话,传递的就相当于L的地址(即指针的指针),这样在函数内修改L本身(让L指向新的节点)就能影响到原始的L。
5. L->next 和 L 本身是不同的东西:
L或副本L存储的是链表头节点的地址,这个值是链表头节点的地址。L->next存储的是链表头节点的next成员,这个值是链表中下一个节点的地址。
1 | typrdef strucrt LNode |
上面是一个用于链表的结构体指针类型定义
函数一:修改一个链表第i个元素(i) 在这个函数中,/要传入的链表L/ 无需加&符号,因为他不涉及对头指针的操作
1 | Status ChangeElem(/*要传入的链表L*/,int i,elemtype e) |
函数二:初始化一个带头节点的空链表 这个函数中,传入的参数就必须是&L,因为它涉及对头指针的操作
1 | Status LinkInit(/*要传入的链表L*/) |
注
如果使用引用符号&,则函数内部可以直接使用L,
但如果使用指针的话,要把所有L换成*L
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 WHAT AM I ?!
