用函数调用所给出的实参(实际参数,actual arguments)向函数定义给出的形参(形式参数,formal arguments)设置初始值的过程,叫做参数传递(Argument Passing)。
在C++中调用函数时有三种参数传递方式:
(1)传值调用;
(2)传址调用(传指针);
(3)引用传递;
总体上参数传递可分为两类,由形参的类别决定:值调用(call by value)和引用调用(call by reference)。
这里传址调用被归为值调用,因为指针传递也是值传递,只不过值传递的是地址。
一、值传递
int main( ) { void swap(int,int); //函数声明 int i=3,j=5; swap(i,j); //调用函数swap return 0; } void swap(int a,int b) //企图通过形参a和b的值互换,实现实参i和j的值互换 { int temp; temp=a; //以下3行用来实现a和b的值互换 a=b; b=temp; }
在main()函数中调用swap(int a,int b)其中i和j值实际上并没有交换,如果想要交换只能使用指针传递或引用传递。
void swap(int* pa,int* pb)
void swap(int& ra,int& rb)
用指针类型作为形参的值调用方式,可以通过参数返回修改后的值。
void main( ) { void swap(int *,int *); int i=3,j=5; swap(&i,&j); //实参是变量的地址 } void swap(int *p1,int *p2) //形参是指针变量 { int temp; temp=*p1; //以下3行用来实现i和j的值互换 *p1=*p2; *p2=temp; }
二、引用传递
按引用传递,引用实参的引用参数传递给函数,而不是进行参数拷贝。引用类型的形参与相应的实参占用相同的内存空间,改变引用类型形参的值,相应实参的值也会随着变化。
int main( ) { void swap(int &,int &); int i=3,j=5; swap(i,j); return 0; } void swap(int &a,int &b) //形参是引用类型 { int temp; temp=a; a=b; b=temp; }