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

传递T所指向的地址呢?
代码如下(初始化功能不能正常运行):
int InitBiTree(BiTree T)

T=NULL;
return 1;
}

void main()
{
BiTree T;(这是结构体指针变量)
InitBiTree(T);

}
我知道在调用那儿加&和在定义那儿改成二重指针就行,但不明白为什么。原来在写链表的时候,我这样都对的。

烙印99
浏览 281回答 2
2回答

慕神8447489

不要拘于表面,一直关心是传值还是传地址,这些又有什么分别,一切皆为数据,你所要理解的是,你所操作的数据是作为普通数据,还是作为内存地址,然而这些又是怎么区分的呢,编译器知道,你知道,编译器又是怎么知道的呢,依靠的是变量类型就拿你的例子来说,你是想吧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的梦想了复杂吗,没觉得啊,值是数据,地址也是数据,不要太死板的看待这些东西

海绵宝宝撒

虽然你在初始化函数里面对T做了赋值,但这个值并没有被你返回到主函数里面。
打开App,查看更多内容
随时随地看视频慕课网APP