亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

您好,請問下指針做為實參是值傳遞還是地址傳遞?比如下面的內容:

您好,請問下指針做為實參是值傳遞還是地址傳遞?比如下面的內容:

烙印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 關注
  • 325 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號