2 回答

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的夢想了
復雜嗎,沒覺得啊,值是數據,地址也是數據,不要太死板的看待這些東西
添加回答
舉報