函数调用参数传值和传址的区别:
传值:把参数拷贝一个副本,然后传递给函数体进行操作。但是对参数的操作不会影响到函数外的参数,范围仅在当前的函数内有效。
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 }