为了账号安全,请及时绑定邮箱和手机立即绑定

您好,请问下指针做为实参是值传递还是地址传递?比如下面的内容:

您好,请问下指针做为实参是值传递还是地址传递?比如下面的内容:

烙印99 2022-01-20 20:15:16
传递T所指向的地址呢?代码如下(初始化功能不能正常运行):int InitBiTree(BiTree T){ T=NULL;return 1;}void main(){BiTree T;(这是结构体指针变量)InitBiTree(T);}我知道在调用那儿加&和在定义那儿改成二重指针就行,但不明白为什么。原来在写链表的时候,我这样都对的。
查看完整描述

2 回答

?
慕神8447489

TA贡献1780条经验 获得超1个赞

不要拘于表面,一直关心是传值还是传地址,这些又有什么分别,一切皆为数据,你所要理解的是,你所操作的数据是作为普通数据,还是作为内存地址,然而这些又是怎么区分的呢,编译器知道,你知道,编译器又是怎么知道的呢,依靠的是变量类型
就拿你的例子来说,你是想吧main函数的T置为NULL,你把它传到InitBiTree函数内,使用T=NULL操作,此时你有没有想过,main函数的T和InitBiTree函数的参数T虽然名字相同,但已不是同一变量,唯一的联系是,两者的值是相同的,但此唯一的联系在你对InitBiTree函数内T赋值为NULL后荡然无存,此时他俩是半毛钱关系都没有了,
这就好比:
int a = 0;
int *b = &a;
int *c = &a;
本来b与c同样指向相同的a,但你认为c=NULL; 操作后,会影响到b吗,当然不可能,你可以想,如果我就是要把b的值改为NULL怎么办,那你就得先想一下你要修改的东西在哪里放着,b的值在&b这个位置放着,如果把这个位置的的东西换成NULL,那b也就等于NULL了,怎么操作呢,
int **d = &b; // 这样d变量里就存下了b的地址

*d = NULL;// 你应该知道*d是在把d里的数据当做一个地址来操作把,把该地址里的数据置NULL

这之后的b的值可就不再是&a了;
同样的,你想把main函数里的T的值置为NULL,那就要先找到这个T的值在哪里放着,&T,毫无疑问,你想要在InitBiTree函数内操作,那就得把我需要的这个位置告诉我,有了这个位置我才能干这个活儿,怎么给呢,int InitBiTree(BiTree *T);函数的参数改成这样(正常情况下是这样写),这样函数的参数就可以接收你的&T,此函数内部只要把你传进来的值当做一个地址,把地址里的数据置为NULL,
*T = NULL;
就实现了将main函数里的T设置为NULL的梦想了
复杂吗,没觉得啊,值是数据,地址也是数据,不要太死板的看待这些东西



查看完整回答
反对 回复 2022-01-23
?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

虽然你在初始化函数里面对T做了赋值,但这个值并没有被你返回到主函数里面。

查看完整回答
反对 回复 2022-01-23
  • 2 回答
  • 0 关注
  • 278 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信