正確理解C C 中的傳值呼叫 傳址呼叫 引用呼叫

2021-09-19 13:09:16 字數 1201 閱讀 3718

首先說明,函式的傳值呼叫和傳址呼叫在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...