c語言實現cpp中的引用傳遞

C語言不存在按引用傳遞,一切都是按值傳遞

這是由C語言的特點決定的,C語言中不需要按引用傳遞,因爲指針技術完全可以理所當然地實現同樣的目的。

而C#和Java 這類不允許指針的語言,就必須區別這兩種傳遞方式。

在C中,唯一容易弄混的地方是,傳遞的參數是數組,如下:

void fun(char *s,int a) {}

或者

void fun(char s[],int a) {}

首先,char s[]這種傳參其實只是編譯器爲方便使用進行的特別處理,其本質仍然是 char *s.

也就是說,實際上只存在一種數組傳參形式,就是char *s .

對於數組傳參來說,看似是引用傳遞,但其實是按值傳遞,怎麼講呢?

調用函數傳入char *s實參時,其實是對指針s 進行一次拷貝,然後將這個拷貝傳遞給形式參數(按值傳遞過程),

在被調用函數中,對數組的操作是對s 的間接操作,也就是說s 雖然本身是按值傳遞進來的,但s 的間接操作卻起到了對 *s 的按引用傳遞效果。

所以,C語言沒有按引用傳遞方式,因爲也沒這個必要。

雖然沒研究過C#和Java的按引用傳遞背後的本質,不過,我猜測只是對C的這層概念的進一步封裝和抽象,因爲C#和Java雖然不允許指針,但其實現機制仍然是指針本身。

----補充一下,c如何實現c++中的引用效果呢?

比如說,鏈表操作中的插入:int Insert(ptrNode &list, int value){///};//cpp

調用:Insert(list, 1);//cpp

那麼用C怎麼實現呢,這裏顯然必須修改list,而如果list恰好是空,該如何是好?

兩種方案:一是在代碼裏插入list是否爲空的校驗,問題是代碼不簡潔,看上去不美觀;第二種我更推薦的是使用指針的指針,函數就變成了:int Insert(ptrNode *list,int value){///};//c

調用:Insert(&list,1);//c

原文地址:http://hi.baidu.com/rayord/item/5ab42844b9db82e7bdf451bb

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