函数传参时,我们有多种方式让形参修饰实参,其中值传递、地址传递与引用各有不同
值传递是将实参复制一份到函数中,所以实参本身不会改变。即改变的是func函数中的a和b,而传入的实参x和y不会改变。
void func(int a,int b) func(x, y);值传递中,形参不影响实参
地址传递中,传递给函数的是地址,函数中是对地址进行操作,所以当函数内产生的赋值、交换等操作也会改变实参。
void func(int *a, int *b) func(&a, &b);形参改变实参
引用即取别名,函数形参&a即实参a的别名,所以函数内的操作也会改变实参。
void func(int &a, int &b) func(a, b);形参改变实参
用数据交换的例子比较三者的不同
#include<iostream> using namespace std; void swap1(int a,int b) //值传递,不会改变实参 { int temp = a; a = b; b = temp; } void swap2(int *a, int *b) //地址传递,改变实参 { int temp = *a; *a = *b; *b = temp; } void swap3(int &a, int &b) //引用,改变实参 { int temp = a; a = b; b = temp; } int main() { int a1 = 5; int b1 = 10; swap1(a1, b1); cout << "值传递" << endl; cout << "a= " << a1 << " "; cout << "b= " << b1 << endl; int a2 = 5; int b2 = 10; swap2(&a2, &b2); cout << "地址传递" <<endl; cout << "a= " << a2 << " "; cout << "b= " << b2 << endl; int a3 = 5; int b3 = 10; swap3(a3, b3); cout << "引用" << endl; cout << "a= " << a3 << " "; cout << "b= " << b3 << endl; }结果: