问题:
形如这样一个通用链表的添加结点的函数:
void List_add(NODE_T *head,void *data)
{
//新建一个结点
NODE_T *newnode = NULL;
newnode = (NODE_T*)malloc(sizeof(NODE_T));
if(!newnode)
{
printf("开空间失败!\n");
exit(0);
}
memset(newnode,0x0,sizeof(NODE_T));
newnode->next = NULL;
//赋值
newnode->data = data;
//找到尾结点
while(head->next)
{
head = head->next;
}
//添加结点
head->next = newnode;
}
其中并没有设置临时变量获取head的值,而是对head直接修改,head不是指针嘛?为什么可以这样直接对head进行修改,而不用担心会不会影响函数外部的head呢?
while(head->next)
{
head = head->next;
}
原因如下:
1.从逻辑上来推,参数传递可以分为值传递和地址传递,如果函数内部改变不影响外部,那么一定是值传递。所以传进去的是head的值。
2.从原理上来推,函数的形参NODE_T *head表示的是要获得一个NODE_T*类型的指针,或者说地址,所以head传给函数的是head里的值,表示的是一个由malloc开辟的堆区的NODE_T 类型的地址段的首地址,即形参需要的类型。
3.换个角度说,如果函数要改变head本身且影响外部,那么传递的应该是head 的地址,即&head。综上,该函数内部修改head是属于值传递,并不会改变外部的head。