c 员中为什么这样写的 sf 交换函数不能正确的交换 a 跟 b 的值?那是因为你还不懂函数的调用的占过程。下面通过这个动画带你快速的掌握函数的调用占过程。首先如果运行这段单码,普林的 f 会在中端中输出 a 等于一, b 等于二,这样的结果 也就是代表没有交换成功 a 和 b 的值。 c 元程序是从慢函数开始运行,我们先了解一下程序的内存模型。简单来说,内存被分为三个区域,一个是代码区域,一个是占区域,一个是堆区域。函数运行的时候使用的是占内存区域。 当我们运行慢函数中的第一行代码时,会在站内存中给 a 跟 b 分配内存空间,并将 a 跟 b 的值写进去,请注意,这段内存属于慢函数的占区域。接着运行 cf 函数,将由 cf 函数 时,会给 suapp 函数的行餐分配内存空间,并将传递给 suapp 函数的食餐, a 和 b 以直传地的形式复制到这两个内存空间,这两个内存空间属于 suapp 函数的站内存空间。接着运行 suapp 函数的代码,首先定义了一个 team 的变量, 同样的需要在内存中给 temper 变量分配空间,它属于 suap 函数的占空间。然后是运行下面的交换代码, a 的值付值给 temp, b 的值付值给 a, 最后再将 team 的值复制给 b, 这样就在 suap 函数的站立存中完成了 a 和 b 的值的交换。 但是重点来了,当死外不函数运行结束返回时,属于死外不函数的占离存空间会被释放掉,死外不函数的占空间会变成无效的内存,不应该再继续访问和使用了。返回到慢函数中继续执行代码,这时候打印的 a 和 b 还是属于慢函数占内存中的 a 和 b 的值,他们压根就没有被交换过,所以打赢的结果还是 a v e b 为二。通过这个动画,你能明白函数的占调用过程了吗?我是陈跃龙,关注我,带你学习更多的 c 元开发小技巧!
粉丝1.4万获赞1.2万

有参和无参函数讲完之后,我们来进一步分析一下函数的调用。函数的调用,我们说是函数名加括号,拿这个无参函数来说,就是 fuz 加括号,如果是有参函数,比如这个 add 函数,我把它复制下来吧, 这些注视部分我就删掉了,看着惊险一点。然后我们要调用,他就是 app 加括号,然后传六和八进去,他就会计算六加八,然后把结果返回出来。按理说我们应该用一个变量的接收这个返回值, 但你说我就不要这个返回值,我就单纯的调用它也是没有问题的,这就是指调用函数不做任何操作。然后我们也可以用一个电量 s 来把它的返回值拿到,你来答应一下, 结果就是十四。十四就是 a、 d、 d 函数的返回值。这行代码的执行过程,其实就是要用 a、 d、 d 函数,然后把六和八作为参数传进去,接着计算六加八,得到 r e、 s, 最后把 r、 e、 s 返回出来,所以这一部分就相当于在当前为止返回了一个十四,最后把十四复制给了 s, 换言之就是这一部分现在其实就相当于一个整形十四。既然这一部分是一个整形十四,那我是不是可以直接把它拿来做数学运算?比如我给他乘以一个二,表面上看好像是把一个函数的调用做了一个数学运算,但其实这里拿到的是函数的返回值,我们是用的这个函数的返回值来做的数学运算,现在他的返回值是十四, 就是说这里我们计算的是十四乘以二,再来打一下 s 不到的结果就是二十八。懂了这个之后,我们再来往上一层思考,既然这个 app 又发,其实就相当于写了一个十四在这,那我这个十四是不是也可以传给 add 函数,接着和另一个数字二做运算? 没问题的吧?因为我们这个 add 函数本来就是计算两个数字的和盟,而刚刚的这个十四我们是通过 add 六八得到的。这样写出来之后,表面看好像是我们把函数的调用传给了另一个函数,当然我们这里只有一个 add, 你有其他函数的话,你传给其他函数也是可以的。但本质上我们传 讲的是这个函数的返回值,现在这里就相当于传了一个十四,现在这个函数又会有一个返回值,我们可以把它复制给一个变量,然后打印这个变量,同样我们也可以直接打印他的返回值都是可以的。 来运行一下,结果就是十六,这就是把函数调用作为参数来使用,但本质其实是把函数的返回词作为参数使用,这个你要明白。