起因:我在学习链表的时候将*head(头指针)作为一个创建新结点函数的形参,在函数中改变了head的指向,传入的实参是head(定义为一个结构指针),但不能改变主函数中head的指向。
我很疑惑因为传入的head不是代表地址吗?那传入的应该也是地址啊?主函数的地址应该也会一起改变吧?
查了一下资料发现形参为指针的函数是复制了实参的地址,也就是主函数和函数中的两个指针指向同一个地址。
就像这个例子(刚开始看到上面的解释脑海里就突然跳出这个):
虽然没有在函数中改变指针的指向,但可以帮助理解!因为在函数中复制了原来函数的地址,所以函数中的p,q同样指向了b,a。所以通过改变*p,*q可以对b,a的值进行改变。
PS:地址是a和b的,不是p和q的!!!
又像这个测试的例子:
可以很明显的看出函数只是复制了一份指针指向的地址。函数中的地址改变并不会影响主函数中的指针地址!
所以要想解决自己一开始的问题就须要定义函数指针将head作为返回值返回!
当然还有第二种方法,就是在主函数传递指针的引用,这时候传递的指针自己的地址,而在函数形参中使用指向指针的指针(**)来两次解地址,这样可以在函数中通过 间接寻址来改变主函数传递的指针指向的地址。
比如这个清除链表的例子:
void freeall(List *list)//删除链表
{
Node *p, *q;
for (p = list->head; p; p = q)
{
q = p->next;
free(p);
}
}
第一次写博客,也是在疑惑中尝试和查阅对没有理解透彻的概念进行梳理!