void swap(int &a, int &b){
int temp = a;
a = b;
b = temp;
}
借着这个简单的swap函数,捋一下它背后的赋值的底层逻辑
我们讲,如果你在那个函数的接收参数里面不写&,即引用,
那么你仅仅是在“传值”。(专业点叫“按值传递”而非“按引用传递”)
这句话,我相信很多人都听说过,我也是,第一次是听翁恺老师讲的。
其实单单把这句话抛出来,我的脑袋还是懵懵的。。
现在,让我来好好地梳理一下这个所谓的“传值”是个什么鬼。。
咳咳,下面开始。
我们从C语言赋值的底层逻辑讲起,最简单的,a = b,这句话啥意思?
我们都会说,“把b赋给a”,好吧,严谨点讲,“把b的值赋给a”。
你会说,切,这他妈有啥,这跟我要问你的这个swap函数有什么关系吗?
关系大了。。
我们先不妨模糊地理解一下这个简单的函数的机理。。
void swap(int &a, int &b);
接收两个参数的引用(地址)。。emm什么鬼?不懂!!
那先从错误的案例开始。。
如果是void swap(int a, int b);会怎么样?
也就是在问,如果我们这么去写的话,程序实际上在做什么事情?
接收两个参数a, b?不,不要讲得这么官方化嘛。
拿具体例子来讲,如果在具体的程序中,有两个数,num1和num2,
我现在要交换他们两个的值。
那么好了好了,如果我这么做,swap(num1, num2);
我实际上在干嘛?
我们按步骤来:
第一步,把num1赋给a,把num2赋给b。一般来说,前者后者分别被叫做实参、形参
欸?是不是有点奇怪?对嘛!我就问你,形参被写下的那一刻,他难道就不占空间吗?
他也是函数的一部分啊!你写函数,定义变量,都是会占用一定的空间的呀!
好了,回到上文,a, b这两个形参被赋完值后,那么进入函数操作..
其实下面就很容易理解了,我们在对这两个被赋值的形参操作,
他们在这个函数体内互换值,但是很明显,数与数的悲欢并不相通。。
num1和num2把值赋完后就被晾在一边了。。因为这个函数本质上是对形参进行操作。。
好了,讲完“按值传递”,“按引用传递”是怎么一回事咧?
经过搜索得到:int& a = b语句的意思,就是把b的地址赋给a的地址,即a,b变量拥有同一地址,那么他们的值必定相等;并且改变a的大小,也同时在改变b的大小。