32、再論函數傳值中指針和引用的區別

一、回憶

    

前面我們談到過指針和引用的區別及聯繫,認識到,指針是一個實體,而引用僅是個別名(綽號);對引用型變量進行除賦值以外的一切操作,相當於對被引用變量進行操作。但是,問題還沒有結束,今天我想到一個問題,開始破滅我心中對前面引用的認識。

    

對引用的介紹,見
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指針顯示在子函數中定義的形參指針(引用)。

    

    

           這樣,我們就不難明白,我們原來的問題的緣由了。再次謝謝兩位學姐指點。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章