通过一个经典函数swap讲一讲按值传递和按引用传递

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的大小。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值