关于数据结构里形参和实惨的传递问题

WinckyZ 2003-07-03 09:35:56
什么时候用指针,什么时候用二级指针呀?
为什么*head本身就是指针型结构体的首地址,而他当实参时又要用&head来传递,形参用二级指针来接收呢?
不能直接用指针来接收形参head吗?
偶到现在还对链表的这一问题百思不得其解
各位高手能不能也举例子帮我解释清楚一点
谢谢
...全文
171 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
liao2001 2003-07-03
  • 打赏
  • 举报
回复
你先明白一级指针先:
int a=0;
func(int *a)
{
*a=12;
}
为什么要传递指针,因为函数入参是值传递。不知道你学过汇编没有,入参是push入栈,再在函数内pop出栈来实现传递的,也就是通过栈间接传递的。如果你传递的不是指针,比如:
func(int a)
{ a=12; }
那么,你修改的仅仅是栈中a的copy,而不是a;

再来看func(int *a)的入参a:
int a;
int *p=&a;
func(p);
其中,参数传递的时候干了什么呢?把p的值push入栈了(注意,是p的值,即a的地址)。也就是说,栈中放着p的copy了。
假如现在你想改变a的值,只要对传入的地址进行操作就行了。
那么假如你是想改变p的值呢?这样行不行:
func(int *cp)
{ cp=123;}
cp=123;仅改变了栈中p的copy的值,与p无关,所以这样是不能修改p的,再看:
func(int **cp)
{ *cp=124;}
func(&p);
现在呢?我们传入了p的地址,也就是说栈中有了p的地址(&p的copy),那么我们通过*操作就可以访问p了。

不能理解的话,先记住一条:入参总是值传递,要想改变函数外的变量的值,就必须传入变量的地址。
蝎子i软件 2003-07-03
  • 打赏
  • 举报
回复
首先,指针变量是一个变量。它和别的变量的区别是:别的变量一般存储的是内容,也就是程序里直接要用的数据;而指针变量存储的是某一个存储单元的地址值,利用这个地址值,可以找到该存储单元,然后就可以对该存储单元的数据进行读/写操作。

例如:int a, *b; //a是个普通的int型变量,它其实就是某个存储单元的名字。
//b是个int型的指针变量,它存储的值是一个地址值,
//这个地址值指向的内存单元的内容将被当作int型看待。
a=1; //把存储单元a的内容设置为1
b=&a; //把存储单元a的地址值赋给b
//现在,b的内容是存储单元a的地址值;
//通过*b,可以获得b所指向的存储单元a的内容;
//其实,*b也就是a了。

如果理解了什么是指针变量,就很好理解二级指针了。
二级指针变量也是一个变量,它和普通指针(一级指针)变量的区别是:
普通指针变量所指向的存储单元的内容是可以直接用的;
二级指针变量所指向的存储单元(其实是个指针)的内容是另一个存储单元的地址,通过这个地址,可以访问到这个存储单元。

例如:int a, *b, **c; //b是普通的指针变量,c是二级指针变量
a=1;
b=&a;
c=&b; //把指针变量b的地址值赋给c
//现在,存储单元c里的内容是存储单元b的地址值;
//通过*c可以找到b存储单元,并把b里的内容当作地址址看待;
//因为通过*b可以找到存储单元a,
//所以*(*c)也可以找到存储单元a。
point_to 2003-07-03
  • 打赏
  • 举报
回复
建议自己编个链表,慢慢体会,会清楚的!
wlfjck 2003-07-03
  • 打赏
  • 举报
回复
明白这一点,当你想修该某个地址里面的内容是,你需要取得这个地址
老鱼趣多多 2003-07-03
  • 打赏
  • 举报
回复
up

69,373

社区成员

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

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