一、回憶
前面我們談到過指針和引用的區別及聯繫,認識到,指針是一個實體,而引用僅是個別名(綽號);對引用型變量進行除賦值以外的一切操作,相當於對被引用變量進行操作。但是,問題還沒有結束,今天我想到一個問題,開始破滅我心中對前面引用的認識。
對引用的介紹,見
http://blog.163.com/zhoumhan_0351/blog/static/39954227200932753054227/
二、問題的引入
在我們討論線索二叉樹的生成和遍歷
http://blog.163.com/zhoumhan_0351/blog/static/39954227200991293851204/
時,對於線索二叉樹的函數Status InOrderThreading(BiThrTree &Thrt,BiThrTree T),注意Thrt參數,我們應用了引用(&)。於是出現了一個問題,既然引用和指針的意義一樣,那麼不用這個引用符號,直接用指針行不行?即用:
Status InOrderThreading(BiThrTree Thrt,BiThrTree T) 也可以吧?!可是,結果卻是不對的。這是爲什麼呢?一開始我也想不明白。後來,在薛學姐和謝學姐的共同幫助下,我終於明白了爲什麼了。
三、問題的解決
1、先測試如下一個小程序,觀測輸出結果:
#include "stdio.h"
#include "stdlib.h"
void fun(int *p)
{
p=(int*)malloc(sizeof(int));
}
int main()
{
int *p=NULL;
fun(p);
if(p==NULL) printf("ov");
return 1;
}
我們發現輸出結果是ov。這下,我們就詫異了,怎麼不是在子函數中,給他賦值了嗎?怎麼還是NULL啊。
2、先來是這樣的
原來,在函數傳值過程中,我們想要傳地址(用指針或引用),只要在子函數中通過malloc等函數或相似操作對傳過來的指針進行了賦值操作,而還想保留和返回指針所指向的當前地址值,就應該用引用,而不應當用指針。因爲,在子函數中,對形參副本-形參中的指針賦值時,已改變了主函數中的實參和子函數形參指向同一地址值的同步性。
如圖中所示。P1指針顯示主函數中定義的實參指針,P2指針顯示在子函數中定義的形參指針(引用)。
這樣,我們就不難明白,我們原來的問題的緣由了。再次謝謝兩位學姐指點。