首先說明,函數的傳值調用和傳址調用在C和C++中都是合法的語法,可是引用調用就只是在C++中合法的。函數
首先給一個廣爲人知的例子指針
#include<stdio.h> void swap(int x, int y) { int tmp = x; x = y; y = tmp; } int main(void) { int a = 1, b = 2; printf("a=%d, b=%d\n", a, b); swap(a, b); printf("a=%d, b=%d\n", a, b); return 0; }
輸出結果是
a=1, b=2
a=1, b=2
沒有交換code
並無完成交換,由於在傳參調用中,main調用swap時候,將實參a, b的值分別拷貝給形參x, y,而後a, b就再也不和swap有關了,swap交換的是x, y的值,可是x, y的做用域只在swap中,他們確實完成了交換,可是swap結束以後,x, y的值也就隨之銷燬了,因此根本不會對行參有任何影響,固然就不會實現實參的交換對象
再給出一個相似的例子作用域
#include<stdio.h> void swap(int *x, int *y) { int tmp = *x; *x = *y; *y = tmp; } int main(void) { int a = 1, b = 2; printf("a=%d, b=%d\n", a, b); swap(&a, &b); printf("a=%d, b=%d\n", a, b); return 0; }
輸出結果是
a=1, b=2
a=2, b=1
完成了交換。io
緣由是這樣的,傳址調用實際上仍是實參到形參的拷貝,不過此次實參是要交換的兩個數字的指針(即地地址),而不是要交換的兩個數自己,雖然形參在swap結束後被銷燬,可是形參是根據要交換的兩個數的地址完成交換的,因此對這兩個數字產生影響,也就完成交換編譯
注意這個語法在C++裏合法,可是在C裏面是沒有的效率
#include<stdio.h> void swap(int &x, int &y) { int tmp = x; x = y; y = tmp; } int main(void) { int a = 1, b = 2; printf("a=%d, b=%d\n", a, b); swap(a, b); printf("a=%d, b=%d\n", a, b); return 0; }
注意:這段代碼若是用gcc編譯會報錯,由於引用調用在C裏面不合法,要用g++進行編譯gcc
輸出結果是
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 參數。