C语言链表:函数内部对头结点head的修改为什么不会改变外面的head?

问题:

形如这样一个通用链表的添加结点的函数:


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。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿峰不想搬砖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值