函数参数的传值和传址

函数调用参数传值和传址的区别:

传值:把参数拷贝一个副本,然后传递给函数体进行操作。但是对参数的操作不会影响到函数外的参数,范围仅在当前的函数内有效。

1 void compare(int a, int b)//两个参数大小的比较

传址:把参数的地址传给函数,在函数体内对参数进行操作,会影响到函数外的参数(也就是会影响参数本身)。

1 void copy(int *des, int sou)//将参数sou拷贝到参数des中

举例:

 1 typedef struct Node
 2 {
 3     ElemType data;
 4     struct Node *next;
 5 }Node;
 6 
 7 typedef struct Node *LinkList;
 8 
 9 /*
10  * Init the List.
11  */
12 void InitList(LinkList *L);
13 
14 /*
15  * Insert the element e at the i-th position of
16  * the List. if successful, return 1. Otherwise,
17  * return 0. 
18  */
19 Status ListInsert(LinkList L, int i, ElemType e);

在初始化链表的时候,用到了双重指针,因为涉及到改变参数L;但是在进行链表插入时,没有使用双重指针,因为此时不需要更改指针L的指向,但是在插入函数内,

L指针所指向的指针修改后可以被保存。如下代码所示:

 1 Status ListInsert(LinkList L, int i, ElemType e)
 2 {
 3     int j = 0;
 4     LinkList s, p = L;
 5 
 6     while (p && j < i - 1)
 7     {
 8         j++;
 9         p = p->next;
10     }
11 
12     if (!p || j > i - 1)
13     {
14         return ERROR;
15     }
16     s = (LinkList)malloc(sizeof(LNode));
17     s->data = e;
18     s->next = p->next;
19     p->next = s;//此处就是L指向的指针被改变后,可以被保存
20     return OK;
21 }
以上内容仅代表个人理解,如有不适之处,还望不吝赐教!
原文地址:https://www.cnblogs.com/wojiaowoen/p/6763215.html