首先說明,函式的傳值呼叫和傳址呼叫在c和c++中都是合法的語法,但是引用呼叫就只是在c++中合法的。
首先給乙個廣為人知的例子
#includevoid swap(int x, int y)
int main(void)
輸出結果是
a=1, b=2
a=1, b=2
沒有交換
並沒有完成交換,因為在傳參呼叫中,main呼叫swap時候,將實參a, b的值分別拷貝給形參x, y,然後a, b就不再和swap有關了,swap交換的是x, y的值,但是x, y的作用域只在swap中,他們確實完成了交換,但是swap結束之後,x, y的值也就隨之銷毀了,所以根本不會對行參有任何影響,當然就不會實現實參的交換
再給出乙個類似的例子
#includevoid swap(int *x, int *y)
int main(void)
輸出結果是
a=1, b=2
a=2, b=1
完成了交換。
原因是這樣的,傳址呼叫實際上還是實參到形參的拷貝,不過這次實參是要交換的兩個數字的指標(即地位址),而不是要交換的兩個數本身,雖然形參在swap結束後被銷毀,但是形參是根據要交換的兩個數的位址完成交換的,所以對這兩個數字產生影響,也就完成交換
注意這個語法在c++裡合法,但是在c裡面是沒有的
#includevoid swap(int &x, int &y)
int main(void)
注意:這段**如果用gcc編譯會報錯,因為引用呼叫在c裡面不合法,要用g++進行編譯
輸出結果是
a=1, b=2
a=2, b=1
完成了交換
可以看到實現了兩個數字的交換,但是這裡的語法和上面的兩種都不一樣,這裡並沒有實參到形參的拷貝,而是直接將main裡面的a, b傳到swap裡面,所以當然交換的就是a, b的值。
上面對int型別引數進行const傳遞只是為了演示其功能。
對於內部資料型別的輸入引數,不要將「值傳遞」的方式改為「const 引用傳遞」。否則既達不到提高效率的目的,又降低了函式的可理解性。例如void func(int x) 不應該改為void func(const int &x)。
只是建議在傳結構體或類物件的時候使用const 引數。
函式呼叫的傳值和「傳址」
函式呼叫的傳值和 傳址 以下文字只想說明乙個問題 所有的引數傳遞都是傳值 要想通過函式改變乙個變數的值,只有將此變數的位址傳入函式。其實c語言中根本沒有傳址這一 說,所有的函式在傳遞引數時都是採用的傳值呼叫,即在呼叫時完成 實參對形參的賦值,也就是說在傳遞引數時永遠都是將實參的值傳遞給形參。形參是乙...
函式的傳值和傳址呼叫(C語言)
1 傳值呼叫。傳值呼叫顧名思義就是將引數的值傳遞給函式,而函式在進行呼叫時會複製這個值,然後將複製的值在函式中進行呼叫。void swap int a,int b int temp temp a a b b temp int main void int x 1,y 2 swap x,y printf...
C 中傳值呼叫和傳引用呼叫的理解
驗證示例的 如下 using system public class argsbyreforvalue static void changebyint inti static void changebystruct person val p val static void changebyclass...