问题描述
我在看 《C语言程序设计 现代方法2》这本书中链表部分的时候有些疑惑.
有这样一个链表:
struct node { int value; struct node *next;};struct node *first;struct node *new_node;first = NULL;new_node = malloc(sizeof(struct node));new_node->value = 10;new_node->next = first;first = new_node;new_node = malloc(sizeof(struct node));new_node->value = 20;new_node->next = first;first = new_node;......
书中有个搜索链表的函数:
struct node *search_list(struct node *list,int n){ for (;list != NULL; list = list->next)if (list->value == n) return list; return NULL;}
然后书中针对这个搜索函数说了这么句话:'因为list是原始链表指针的副本,所以在函数内改变它不会有任何损害'.我对这句话中的'副本'感到困惑,函数的参数是个指针类型,不应该是指向同一个地址的变量吗?怎么是个副本呢?望大神答疑解惑!
问题解答
回答1:这个副本的意思是指这个指针变量本身的副本(而不是所指内容的副本),也就是说你在函数里面可以随便让 list 指向任何地方,都不会影响函数外面 list 的指向。比如有个地方这样调用:
struct node *list = xxx;int n = 10;search_list(list, n); // 假设这里面把 list 指向 yyyprintf('%dn', *list == xxx); // 这里 list 还是指向 xxx,所以为 true (输出为 1)
那么不管 search_list 里面把 list 往哪里指,外面那个 list 指针变量还是指向 xxx。
回答2:函数的传参永远都是会copy一个副本的,无论什么类型