请教一个c语言链表问题,请懂的人回答一下下

zero_rose 2018-03-20 09:01:16
小弟近日在学习c语言链表时,对于一个函数感到十分奇怪,函数如下:

int ListLength(Listnode *node){

int i = 0;
while(node)
{
++i;
node = node->next;
}
return i;
}


其中Listnode是一个链表结构体,我的疑惑是在调用这个函数时,链表的头链表为什么不会改变,因为我总觉得当用头链表的地址作为形参调用函数,在函数体中头链表的地址被修改了,为什么不会改变呢?
...全文
381 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhouqunhai 2018-03-23
  • 打赏
  • 举报
回复
这是由于函数的副本机制,函数的传递都是值传递,实参的值是拷贝给形参的,修改形参不能改变实参,只能传递地址
赵4老师 2018-03-23
  • 打赏
  • 举报
回复
数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633
0ltremar3 2018-03-22
  • 打赏
  • 举报
回复
因为传入函数里的是指向结构体的指针,存储的是结构体的地址;你说的那种情况要传入该指针的地址(指针的指针)才行。
donjin9 2018-03-20
  • 打赏
  • 举报
回复
在调用函数的时候,这里的node就从传入的变量拷贝了一份。只是用来暂时存放结点的地址。 除非你加引用。
自信男孩 2018-03-20
  • 打赏
  • 举报
回复
原因是node是List Length函数里的局部变量,参数传递,就是值传递,即实参的值赋值给形参(形参是函数内的局部变量),那么若是指针给指针传值,就是传的地址值。node是指针,它用于存放地址,而内存空间(节点的存放位置)是在堆上,不在函数栈上。而node只是用于存放堆上节点的地址。所以,node = node->next修改的是node指向的位置,而没有修改堆上节点的next指向节点。
wallesyoyo 2018-03-20
  • 打赏
  • 举报
回复
C语言中,函数的传递都是值传递,也就是说,实参的值是拷贝给形参的,所以修改形参的值,改变不了实参的值。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧