C语言形参是指针的问题梳理

起因:我在学习链表的时候将*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);
	}
}

第一次写博客,也是在疑惑中尝试和查阅对没有理解透彻的概念进行梳理!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值