相信很多初学者在写函数时会遇到一个问题,就是我明明在函数里修改了这个值啊!为什么执行后没效果呢?
这时大多人就会检查代码逻辑,一看,诶呀!没错啊!是为什么呢?
大概是我们没搞清函数参数传递时值传递(pass by value)和引用传递(pass by reference)而导致的!!!
下面看一个简单的小例子,就能体会到这两者的区别啦~
下面程序的需求很简单,就是交换两个数的值,相信大家都写过,那让我们从这个简单的例子里学习什么是值传递、什么是引用传递吧!!!
程序代码如下
#include <iostream>
using namespace std;
void swap1(int a, int b) {
cout << "a的地址为:" << &a << endl;
cout << "b的地址为:" << &b << endl;
int tmp = a;
a = b;
b = tmp;
}
void swap2(int& a, int& b) {
cout << "a的地址为:" << &a << endl;
cout << "b的地址为:" << &b << endl;
int tmp = a;
a = b;
b = tmp;
}
int main()
{
int a = 6, b = 8;
cout << "a的地址为:" << &a << endl;
cout << "b的地址为:" << &b << endl;
cout << "---调用swap1---" << endl;
swap1(a, b);
cout << "---调用swap2---" << endl;
swap2(a, b);
return 0;
}
程序运行结果如下
相信大家在一开始写交换两个数这个函数的时候,一般会写成swap1这样的样子,但执行后发现两个数并没有交换,这到底是为什么呢?
如下图所示
在执行swap1的时候,由于是值传递,函数就会在其内部new 出一个int,让它的值等于传递过来的值,再加上new出来的值其作用域只在当前函数内(局部变量),即其“生命”在函数执行完就结束了,由于没有修改对应内存地址上的值,而是修改了新new出来位置上的值,当然就没有效果啊!!!
在执行swap的时候,由于是引用传递,内部的两个局部变量a和b直接会指向main函数里a和b的地址,直接修改对应的值,相当于直接对main函数里a和b的直接操作,当然就有效果了!!!(实质就是省去了new一个值再复制值放入新的临时变量中的操作,让函数参数列表中的值直接指向函数外变量对应的内存地址)