以c(c++)為例,函式引數傳遞一般來說有三種方式:值傳遞,指標傳遞,引用傳遞。其中引用傳遞屬於c++對c函式引數傳遞方式的擴充套件。
實際上c語言的所有引數都以「傳值呼叫」方式進行傳遞,這意味著函式獲得的是引數值的乙份拷貝,函式可以放心的修改這個拷貝值,而不會影響實參。---《c和指標》
# 值傳遞:值傳遞是傳遞乙個實參的拷貝副本,因此在函式內部對引數的操作,相當於對該實參拷貝副本的操作,對實參本身沒有任何的影響。**示例如下:
#include
void
swap2element
(int , int)
;void
main
()void
swap2element
(int a, int b)
上例中函式swap2element(int a, int b) ,本意是實現兩個函式引數值的交換。但是由於函式引數a跟b是所傳遞實參k和j的拷貝副本,也就是說a和b相當於在記憶體中又重新開闢了兩塊記憶體,這兩塊記憶體儲存的值是k和j的拷貝。在函式內部對新開闢記憶體直接進行操作,與原實參無關。
指標傳遞:
為了在函式內部對實參的值進行修改,此時我們可以採用指標傳遞,把實參的位址或者某指向要修改內容的指標作為函式引數,傳遞給函式。如下例:
#include
void
swap2element
(int *, int *)
;void
main
()void
swap2element
(int *a, int *b)
成功交換兩者的值。
引用傳遞:
引用傳遞其實很多地方類似於指標傳遞,引用是原實參的另乙個名字,比如乙個人在家叫:阿狗,他在學校叫:張三,雖然名字不一樣,但是代表了同乙個人。因此引用是同乙個東西的不同叫法,你對其中乙個更改了,另乙個也要跟著變(相當於指標,指向同一塊記憶體)。
int a = 10;
//!< b為引用型別,&為申明符號,不是取位址。引用型別宣告的同時需要定義。
const
int &b = a;
b = 20; // error,b is const type
a = 20; //right
printf("b =%d\n",b); //!< b = 20
引用傳遞一定意義上沒有指標傳遞靈活,還是有它的適用情況。當我們要給函式傳遞引數時,有這樣的乙個不成文的約定,對於在函式內部要修改的函式引數,建議使用指標傳遞;對於在函式內部無需修改的函式引數,且函式引數是乙個很大的類或乙個大的結構體,建議使用引用傳遞,這樣可以不用對實參複製拷貝,減小開銷,為了防止該引數在函式內部被改變,可以加上const宣告。
如: beifa(const int &a)
則在函式beifa()內部不能修改a的值。
綜上所述,心細的我們可以發現,即使我們聲稱,函式引數傳遞有三種不同的方式,分別為:值傳遞,指標傳遞,引用傳遞。且這三種不同的方式各有優缺點和不同的適用情況。但從乙個更高的角度考慮,其實函式引數傳遞只存在值傳遞一種方式,對於所有的函式引數,我們在函式內部對函式引數的直接修改都是無效的。
什麼叫對函式引數的直接修改呢?
實參傳遞:swap2element(int a,int b)
我們在函式內部對 a 和 b的修改都是無效的;
指標傳遞: swap2element(int *a, int *b)
為什麼我們可以修改a 和 b的值呢,因為指標傳遞的是a和b的位址,位址才是真正的函式引數,a和b是對位址的取值,我們是可以修改位址的取值,卻無法修改a和b的位址,對位址的修改是無效的。
謹記08年汶川**,願越來越好。
2015/5/12
by lb
C 函式引數 值傳遞與引用傳遞
以前我們在c語言中函式引數傳遞過程中,如果我們想要讓當a函式作用域中的變數經過b函式處理之後的數值仍然在a函式中生效,這個時候函式引數的傳遞時需要引用方式去傳遞,方式如下 include 函式引數為指標,通過修改指標裡面的內容達到對main中b變數的修改 void func int a int ma...
函式引數按數值傳遞和按位址傳遞
函式中我們引數傳遞在很多情況下都是傳遞變數的數值,然後根據這個數值在函式體內進行運算或return或輸出某些我們想要得到的東西,但是有些特殊情況我們不容易通過傳遞數值的方式得到我們需要得到的東西,比如通過乙個學生買課id我們可以得到這個課程的名稱和這個課程的名稱,如果這個函式在乙個類內部,我們可以設...
JS中函式引數值傳遞和引用傳遞
也許大家對於函式的引數都不會太在意,簡單來說,把函式外部的值複製給函式內部的引數,就和把值從乙個變數複製到另乙個變數一樣。深入研究,你會發現其實沒那麼簡單,這個傳參是要分倆種情況 其實這是個錯誤的說法,ecmascript中所有函式的引數都是按值傳遞的 高程3 原話,之所以這裡說倆種,是因為結合引用...