值传递、地址传递与引用
函数传参时,我们有多种方式让形参修饰实参,其中值传递、地址传递与引用各有不同
值传递
值传递是将实参复制一份到函数中,所以实参本身不会改变。即改变的是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;
}
结果: