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