C++中的傳參方式

1、參數傳遞的概念 

所謂參數傳遞就是用函數調用所給出的實參(實際參數)函數定義所給出的形參(形式參數)設置初始值的過程。

在c++中,調用函數時有三種參數傳遞方式,分別爲:

(1)傳值調用;

(2)傳址調用(即是傳指針);

(3)傳引用

    總體上參數傳遞可以分爲兩類,由形參的類別決定:值調用與引用調用。除了定義爲引用類型的形參外,其他類型的形參都是對應着值調用。指針傳遞也是值調用,只是它是值傳遞的是地址。下面對這三種參數傳遞方式進行詳細的說明:

值傳遞:

    值傳遞時,實參被拷貝了一份,然後在函數體內使用,函數體內修改參數變量時修改的只是實參的一份拷貝,而實參本身沒有改變,所以如果想要在調用的函數中修改實參的值,使用值傳遞不能達到其目的,這時只能使用引用或者指針傳遞。下面代碼可以說明:

void swap(int a ,int b )      //此時傳遞的實參i與j的值在這裏只是一份拷貝,交換的是他們的拷貝的值,而不是實參本身,出了這個函數的作用域之後,他們的拷貝值被銷燬,因此i與j的值根本就沒有交換。

{

             int temp = 0;

            temp = a;

             a = b;                                                            

             b = temp;

}


int main()

{

             void swap( int, int);

             int i = 10;

             int j = 20;

            swap(i, j);

            cout << "i=" << i << endl;

            cout << "j=" << j << endl;

            system( "pause");

             return 0;

}

wKioL1cvQwii7CdYAAAoS6ThHhs701.png

wKioL1cvQtvD3YyQAAC5fgv0WCQ562.png


引用傳遞:

int main()

{

             void swap( int &, int &);

             int i = 10;

             int j = 20;

            swap(i, j);

             return 0;

}

void swap(int &a , int &b )

{

             int temp;

            temp = a;

             a = b;

             b = temp;

}

下面是此段代碼的彙編代碼:

int main()

{

00824410  push        ebp 

00824411  mov         ebp,esp 

00824413  sub         esp,0DCh 

00824419  push        ebx 

0082441A  push        esi 

0082441B  push        edi 

0082441C  lea         edi,[ebp-0DCh] 

00824422  mov         ecx,37h 

00824427  mov         eax,0CCCCCCCCh 

0082442C  rep stos    dword ptr es:[edi] 

0082442E  mov         eax,dword ptr ds:[0082F000h] 

00824433  xor         eax,ebp 

00824435  mov         dword ptr [ebp-4],eax 

            void swap(int &, int &);

            int i = 10;

00824438  mov         dword ptr [i],0Ah 

            int j = 20;

0082443F  mov         dword ptr [j],14h 

            swap(i, j);

00824446  lea         eax,[j] 

00824449  push        eax 

0082444A  lea         ecx,[i] 

0082444D  push        ecx 

0082444E  call        swap (08214A1h) 

00824453  add         esp,8 

spacer.gifwKiom1cvQlrgtFHLAAAxKY9CoG4216.png







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