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;
}
引用傳遞:
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