链表的插入问题

BUG:

今天我写了一个很SB的代码,这个问题其实我早己注意到,在以前写这样的代码的时候,我也留了个心眼,但可能是
很长时间不写这些东西导致新问题的产生。
其实这个问题我以前也写过笔记,现在再写一下加深印象。
先附代码:
  1. #ifndef LIST_INSERTREMOVEPRINT_H
  2. #define LIST_INSERTREMOVEPRINT_H
  3. #include<iostream>
  4. struct ListNode{
  5. int val;
  6. struct ListNode *nxt;
  7. };
  8. void addListNode(struct ListNode*list,int value){
  9. struct ListNode *nodeInsert=(struct ListNode*)(malloc(sizeof(struct ListNode)));
  10. nodeInsert->val=value;
  11. nodeInsert->nxt=NULL;
  12. if(list==NULL){
  13. list=nodeInsert;
  14. return ;
  15. }
  16. struct ListNode *iter=list;
  17. while(iter->nxt!=NULL){
  18. iter=iter->nxt;
  19. }
  20. iter->nxt=nodeInsert;
  21. }
  22. #end
其实熟悉的人一看就知道问题出在哪了!!!!!
高亮部分就说明了这个问题。犯这个错误的原因在于对指针的传递不太明白。
  1. void addListNode(struct ListNode*list,int value)
在这个函数中有两个形参,一个是链表节点的指针类型,别一个是int 型啰。
对于这个链表节点指针,我们传入的是什么呢?当然,传入的是一个地址嘛,因为它是指针。
嗯,我们是如何传递这个指针的呢,传值嘛!!!!!!!。你传递地址还是传值啊,只是这个值是”地址“而己嘛。
既然明白这点,那么问题来了,你在函数体内改这
  1. list=nodeInsert
你这个是什么意思啊?,,,把这个nodeInsert地址付值给list ?
也就是你有这么个函数
  1. void test(int a,int value){
  2. int c;
  3. a=c;
  4. }
你这是什么意思? 你还真想通过在函数体内的a=c 来改变实参值吗? 滚你妈的。
  1. iter->nxt=nodeInsert;
这个就更扯蛋了,你还是在改变形参中的值,这个肯定不行啦。

如何解决这个BUG

      1,  如果要通过形参改变实参,对于这个地址的传值问题,可以通过 "*" -----解引用运算符。
       也就是我们通过这个解引用这个形参,这样找到形参地址对应的空间,在内存里面改变这个实叁的值。
       2,传入指针的指针,再用解引用运算符。
       反正得解引用才能通过形参改实参!!!!!!
      





原文地址:https://www.cnblogs.com/yml435/p/4655455.html