正確理解C/C++中的傳值調用/傳址調用/引用調用

首先說明,函數的傳值調用和傳址調用在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 參數。

相關文章
相關標籤/搜索