「理论上应该没有问题的呀,要实现交换两个变量的值容易得很!可是老爹的笑容让我心里一阵发毛……这其中绝对有猫腻!」
面对老爹提出的疑问,原本信心满满地我瞬间失去了所有的底气。一旁的小弦子虽然没有吭声,眉头却是皱得跟个小老头儿似的。
有道是实践是检验检验真理的唯一准则,是骡子是马,拉出来溜溜不就知道结果了么?
于是乎我三下五除二就写好了s函数,为了谨慎起见,我还在函数中打印了交换前后的值。
以我如今的水品写这种简单的代码出错的几率还是很小的,编译运行一气呵成,小黑屏上打印出来的结果的的确确显示两个变量的值已经成功交换了。
「这是几个意思?难道老爹是在故布疑阵,唱空城计?」
小弦子看到我咬手指甲,面露沉思,于是也把脑袋凑过来看了一眼显示屏,随即开始捏着下巴冥思苦想。
「老爹,打印的结果明明显示交换成功了呀!」
为了稳妥起见,我还进行了单步调试,可是一切都按照预期的流程执行,结果也是预期的结果。最终我还是没有发现问题到底出在哪里,于是只能向老爹求助。
「我可没有让你打印形式参数x,y的值,我说的是交换实际参数a和b的值,也就是这样:
int a = 3;
int b = 4;
s(a,b);
printf(“a =%d\n“, a);
printf(“b =%d\n“, b);」
「桥豆麻袋,形式参数……实际参数又是从哪儿冒出来的新名词啊?」
「哦,这点是我的疏忽,在给你们讲函数这一部分知识的时候忘了说。函数参数列表中的变量叫做形式参数,比如说:
s(int x, int y)
这里的x和y就就做形式参数。
而我们在调用函数时,为函数传递的参数,这个就叫实际参数,例如:
s(a,b)
a和b就是实际参数。
而我刚刚提出的要求是要交换两个是实际参数的变量,所以我们应该监控a和b在调用函数的前后的变化。」
明白了老爹的意图后,我对代码进行了更改,然后重新编译、运行。
「WHAT!」
看到小黑屏上打印的结果后,我没有忍住喊了出来。因为屏幕上打印的结果显示,a和b在调用s函数前后居然没有任何变化!我简直不敢相信自己的眼睛,这就好比你用计算器计算1+1的值,它妹的居然给你显示1+1=3!
为了委托期间,我重启了电脑又执行了几次,但是结果都是一样的!换句话说,s函数交换a和b的值失败了,但是函数分明已经是执行了的!
「老爹,这是怎么回事儿啊?」
我实在是想不通这其中的症结所在,只能够向老爹提问。
「这就要从函数参数的传递问题开始说起了。
在C语言中,我们在调用函数的时候,参数的传递实际上是采用的值的传递方式,什么意思呢?
就拿我们刚刚举那个例子来说,当我们在调用s(a,b)的时候,实际上是把a的值3复制了一份给变量x,而不是a这个变量换了一个名字,变成了x。同理,变量b的值4复制了一份给y。而x和y跟a和b没有任何关系,所以在函数中无论我们对x和y做什么操作,都不会影响到a和b,所以对a和b进行值交换没有成功。」