【连载】(开始学习C语言的指针)——乐创DIY C语言讲义——6.1节

6.1  函数参数传递的不可逆性
在开始第六章正式讲解前,我们先来回顾一下之前写的函数。第四章中我们有讲到函数是用来实现某一特定功能的代码模块。比如,当我们需要频繁地使用某一段代码来计算三角形面积时,那么可以将实现这一功能的代码片段打包成一个函数,提供给其他代码调用。如“float triangle_area(float base, float height)”,在这个函数中,“triangle_area”为函数名,它是一个返回“float”类型的函数,而括号中的“float base”和“float height”正是用来分别将需要求解的三角形的底边长和高传递进函数的参数,我们称为“形式参数”或者“传递参数”。其他代码需要使用求解三角形的面积时,只需要调用“triangle_area”即可。一旦这个函数被调用之后,程序立即会跳转到三角形面积求解的代码中去进行计算,计算完成后,会以“float”的形式将三角形的面积返回出来。所谓返回值,即函数运算完成之后返回结果的一个数值,一个函数最多只能返回一个返回值,我们只需要在函数内部定义一个与函数类型一样的变量,将运算结果存储在里面,并且使用“return”关键词即可将其返回。关于三角形面积求解的函数,如图6-1-1所示。
图6-1-1 三角形面积函数
回顾完成上面内容之后,趁着记忆比较新鲜,再来用C语言来解决一个问题,假设小明和小丽是一对好朋友,小明手里有一杯焦糖玛奇朵,小丽手里有一杯双拼奶茶,他们各自喝了半杯,都想尝一下对方手中饮料的味道,本来交换一下是一件很简单的事情,但是他们又不希望各自的杯子被对方喝到,那么只能交换杯子中的饮料了,请帮他们设计一个函数,用来交换杯子中的饮料。
这其实是一个非常简单的变量内容交换问题,只需要再去找一个杯子,把小明的饮料倒在里面,然后把小丽的饮料倒给小明,最后将第三个杯子中原本小明的饮料倒给小丽就可以解决,我们可以很简单地来完成这个函数,如图6-1-2所示。
图6-1-2 交换杯子中的饮料
小明和小丽看了这个算法之后,他们都不想动手来倒这杯饮料,就这样僵持着,他们想到了一个办法,交给小明的姥姥来完成这个交换饮料的功能,那么此时,小明的姥姥就相当于这个饮料交换的特定模块,我们可以将其联想成一个C语言中的函数。小明的饮料和小丽的饮料传给姥姥时,就相当于将传递参数传给函数。那么因此我们可以写出如图6-1-3中的代码。
图6-1-3 变量交换函数
仔细观察一下图6-1-3中代码的输出值,我们惊讶地发现,函数并没有达到我们想要的结果,小明杯子中的饮料和小丽杯子中的饮料还是没有交换,仔细阅读了多次代码,没有发现任何问题。这个确实不是代码的问题引起的。借用上面这个故事,有一个关于函数调用的重要特性大家一个要注意,即函数传递参数是单向传递的,无论函数中对形式参数如何改变,在调用函数处传递参数的值完全不受影响,这个一定要注意。而函数唯一可以将结果传递给主函数的途径就只有返回值这一个途径,但是函数的返回值又是唯一的。这就类似于姥姥看到了两个娃娃在把杯子中的饮料倒腾来倒腾去不卫生,不肯交换完成一样。因此对于上面这个问题我们是否就束手无策了?
继续我们的故事,正当此时,路过的老王叔叔过来了,看到大家都属愁眉苦脸的,上去询问情况,了解情况后,王叔发现,这两个杯子一模一样,并且每个杯子内部是有内胆的,只需要将内胆拧下来,交换一下即可,最后大家都开开心心,各回各家了。我们可以写出如图6-1-4中的代码。
图6-1-4 利用指针交换变量中的数值
(0)

相关推荐