5.4 函数的参数传递
前面提到了函数调用时实参要给形参传值即参数传递,传值的方式有两种:(1)传递数值,这里数值指整型、实型、字符型等;(2)传递地址,如数组名、指针等。这两种传值方式在具体使用时有所区别。
(1)传递数值
如果是传递数值的话,实参和形参各自占有独立的存储单元,形参的改变不会影响到实参,下面看两个例题。
【例5.3】编写一个函数:接收某个圆的周长c,计算并返回该圆的面积s。
运行结果如图5-4所示。
图5-4
分析:
主函数中定义了一个变量c代表圆的周长,而且作为实参其值传递给了形参L,虽然都是代表周长,但是两者在内存中各自占有独立的存储空间,如图5-5所示。
图5-5 传递数值
作一个假设,在函数calArea()中对形参L的值进行修改,这个改变会影响到main函数中的变量c吗?当然不会。更典型的,看一个数据交换的例题5.4。
【例5.4】数据交换(传递数值)。
运行结果如图5-6所示。
图5-6
分析:
程序中是想交换变量a和b的值,但是最后的运行结果表明并没有达到预期的目的。仔细分析程序不难发现其中的问题所在。a和b为实参,其值分别传递给形参x和y。在调用swap函数的过程中,交换的是形参x和y的值,调用结束后形参的空间被释放了,因此main函数中最后输出的a和b的值还是原来各自的值,并没有真正的交换,如图5-7所示。
图5-7 数据交换(传递数值)
(2)传递地址
如果是传递地址的话,实参和形参占有同一个存储单元,形参的改变即实参的改变,下面看两个例题。
【例5.5】数据交换(传递地址)。
运行结果如图5-8所示。
图5-8
分析:
本例题也是交换数据,从运行结果来看达到了预期的目的。和例题5.4对比说明,从声明上看,程序5.4中形参为普通的整型变量,本例题中形参为指针形式。调用时,本例题的实参要求是地址值。这时形参和实参共用同一个存储空间,修改了形参也就是修改了实参,如图5-9所示。
图5-9 数据交换(传递地址)
【例5.6】数组名作为参数。
运行结果如图5-10所示。
图5-10
分析:
观察例题中的函数声明,第一个参数为整型数组形式,第二个参数为int型,在调用时第一个实参为数组名array。这里特别容易出错,初学者往往容易把实参写为array[6],而array[6]为数组元素的表示方法,对于数组array来说,array[6]又是非法元素,下标已经越界了。因此正确的实参应该为数组名array,表示的是数组首元素的地址。有没有array[6]这种参数形式呢?看个例子。
函数声明为:int sum(int,int);
还以数组array为例,如果函数调用为sum(array[2],array[4]);形式,当然也是可以的,这也属于前面的传递数值,和传递普通的整型变量一样,但并不是传递地址。读者一定要区分开传递数组元素和传递数组名的不同之处。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。