2 回答
TA貢獻(xiàn)1780條經(jīng)驗(yàn) 獲得超1個(gè)贊
不要拘于表面,一直關(guān)心是傳值還是傳地址,這些又有什么分別,一切皆為數(shù)據(jù),你所要理解的是,你所操作的數(shù)據(jù)是作為普通數(shù)據(jù),還是作為內(nèi)存地址,然而這些又是怎么區(qū)分的呢,編譯器知道,你知道,編譯器又是怎么知道的呢,依靠的是變量類型
就拿你的例子來(lái)說(shuō),你是想吧main函數(shù)的T置為NULL,你把它傳到InitBiTree函數(shù)內(nèi),使用T=NULL操作,此時(shí)你有沒(méi)有想過(guò),main函數(shù)的T和InitBiTree函數(shù)的參數(shù)T雖然名字相同,但已不是同一變量,唯一的聯(lián)系是,兩者的值是相同的,但此唯一的聯(lián)系在你對(duì)InitBiTree函數(shù)內(nèi)T賦值為NULL后蕩然無(wú)存,此時(shí)他倆是半毛錢關(guān)系都沒(méi)有了,
這就好比:
int a = 0;
int *b = &a;
int *c = &a;
本來(lái)b與c同樣指向相同的a,但你認(rèn)為c=NULL; 操作后,會(huì)影響到b嗎,當(dāng)然不可能,你可以想,如果我就是要把b的值改為NULL怎么辦,那你就得先想一下你要修改的東西在哪里放著,b的值在&b這個(gè)位置放著,如果把這個(gè)位置的的東西換成NULL,那b也就等于NULL了,怎么操作呢,
int **d = &b; // 這樣d變量里就存下了b的地址
*d = NULL;// 你應(yīng)該知道*d是在把d里的數(shù)據(jù)當(dāng)做一個(gè)地址來(lái)操作把,把該地址里的數(shù)據(jù)置NULL
這之后的b的值可就不再是&a了;
同樣的,你想把main函數(shù)里的T的值置為NULL,那就要先找到這個(gè)T的值在哪里放著,&T,毫無(wú)疑問(wèn),你想要在InitBiTree函數(shù)內(nèi)操作,那就得把我需要的這個(gè)位置告訴我,有了這個(gè)位置我才能干這個(gè)活兒,怎么給呢,int InitBiTree(BiTree *T);函數(shù)的參數(shù)改成這樣(正常情況下是這樣寫(xiě)),這樣函數(shù)的參數(shù)就可以接收你的&T,此函數(shù)內(nèi)部只要把你傳進(jìn)來(lái)的值當(dāng)做一個(gè)地址,把地址里的數(shù)據(jù)置為NULL,
*T = NULL;
就實(shí)現(xiàn)了將main函數(shù)里的T設(shè)置為NULL的夢(mèng)想了
復(fù)雜嗎,沒(méi)覺(jué)得啊,值是數(shù)據(jù),地址也是數(shù)據(jù),不要太死板的看待這些東西
TA貢獻(xiàn)1809條經(jīng)驗(yàn) 獲得超8個(gè)贊
雖然你在初始化函數(shù)里面對(duì)T做了賦值,但這個(gè)值并沒(méi)有被你返回到主函數(shù)里面。
添加回答
舉報(bào)
