C/C++中的3中函數參數傳遞方式

在C/C++中,有3種函數參數傳遞方式,分別是:值傳遞、地址傳遞以及引用傳遞。(Ps:嚴謹來說,引用傳遞是C++的語法中才有的,C中只有值傳遞和地址傳遞這兩種方式)

注意:

  1. 形參只有在函數被調用時纔會被臨時分配內存空間,當調用結束時內存便會被釋放
  2. 地址傳遞本質上也是值傳遞,二者傳遞的都是實參值的一個拷貝
  3. 在C中,實參與形參之間的參數傳遞是單向的,即只能由實參傳遞給形參,反之則不行

值傳遞

由於值傳遞比較簡單,就不細說了,需要明確的是,由於形參操作的只是實參的一個副本,因此對形參的操作並不會改變實參的值

地址傳遞

以下面一段代碼爲例:

#include <stdio.h>
    //值傳遞傳地址
void swap( int *x, int *y);
int main()
{
    int a=5,b=8;
    printf("傳參前:實參爲&a,&b\na=%d,地址爲%d\nb=%d,地址爲%d\n\n",a,&a,b,&b);
    swap(&a,&b);
    printf("傳參後:實參爲&a,&b\na=%d,地址爲%d\nb=%d,地址爲%d\n\n",a,&a,b,&b);
    return 0;
}
void swap(int *x,int *y)
{
    int *tmp= NULL;
    tmp=x;
    x=y;
    y=tmp;
        printf("在被調函數中:形參爲*x,*y\n*x=%d,x=%d,地址爲%d\n*y=%d,y=%d,地址爲%d\n\n",*x,x,&x,*y,y,&y);
}

運行結果如下:

 

在地址傳遞中,我們闊以看到,經過參數傳遞後,實參的值被“改變”了,a變成了8,而b變爲了5。但本質上,實參的值並未發生變化,這是由於在調用函數swap()時,傳入的實參其實是&a和&b,而非a和b,傳參後,從上圖可以看出,實參&a和&b的值並未改變,仍然是a和b的地址因此,對於地址傳遞來說,其本質上就是值傳遞,而值傳遞不改變實參的值。

至於a和b的值在地址傳遞時爲什麼發生了改變,則是由於在被調函數中將指針指向了真實的變量a和b的地址,而對指針所指地址的內容的改變能夠反映到函數外,也就改變了函數外的變量a和b的值。

引用傳遞

引用傳遞是C++中才有的,變量的引用相當於爲變量起了一個別名(覺得不好理解的話,就把他當作這個變量),因此將變量的引用作爲實參傳遞時,形參改變就會引起實參的改變(因爲實參和形參是指的同一個變量,形參變實參自然會跟着改變)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章