用数组名作函数参数时,形参和相对应的实参都必须是类型相同的数组,必须有明确的数组说明。当形参和实参二者不一致时,就会发生错误。在用数组名作函数参数时,不是进行值的传递,即不是把实参数组的每一个元素的值都赋予形参数组的各个元素。因为实际上形参数组并不存在,编译系统不为形参数组分配内存。数组名就是数组的首地址,因此在数组名作函数参数时所进行的传递是地址的传递,即把实参数组的首地址传递给形参数组名。形参数组名取得该首地址之后,也就等于有了实在的数组。实际上是形参数组和实参数组为同一数组,共同拥有一段内存空间。
如图7-11所示,设a为实参数组,类型为整型。a占有以2000为首地址的一块内存区,b为形参数组名。当发生函数调用时,进行地址传递,把实参数组a的首地址传递给形参数组名b, b也取得该地址2000。于是a,b两数组共同占有以2000为首地址的一段连续内存单元。从图中还可以看出,a和b下标相同的元素实际上也占有相同的内存单元。例如,a[0]和b[0]都占用2000~2003单元,a[0]等于b[0]。类推则有a[i]等于b[i]。
图7-11 实参数组和形参数组
例7.7 对例7.6 ,用数组名作函数参数来实现。
解题思路:
用数组名作为函数的参数,将实参数组名传递给形参,即是将实参数组首元素的地址传递给了形参数组名,则形参数组和实参数组拥有同一段内存空间。
编写程序:
创建一个名为“eg7_7.c”的新文件,在编辑窗口中输入下面的程序代码。
运行结果:
程序说明:
(1)本例中定义的函数addFun ( ),形参是一个整型数组a。在main ()函数中先输出实参数组x各元素的值,然后用实参数组名作为参数调用addFun()函数,对数组各元素的值增10。子函数执行完毕返回主函数后,再次输出数组元素的值。从输出结果可以看出,调用子函数前后输出的数组元素的值发生了改变。
(2)同样对本例题进行断点调试,程序运行到断点1~3时,变量值的情况如图7-12~图7-15所示。在调用子函数时,将实参数组x的首地址传递给形参数组a。从图中也可以看出,数组x和数组a的首地址一样都为“0x0015f848”,而并没有给形参数组a的元素分配内存空间,数组a和数组x共同拥有一段内存空间。改变形参数组a元素的值也就改变了实参数组x元素的值。
图7-12 程序运行到断点1时数组x各元素的值
图7-13 程序运行到断点2时数组a各元素值
图7-14 程序运行到断点2时数组x各元素的值
(www.daowen.com)
图7-15 程序运行到断点3时数组x各元素的值
例7.8 数组a中存放了5个学生的身高值,求他们的平均身高。
解题思路:
用数组名作为函数的参数,将实参数组名传递给形参,则形参数组名也同时指向了实参数组。
编写程序:
创建一个名为“eg7_8.c”的新文件,在编辑窗口中输入下面的程序代码。
运行结果:
程序说明:
本程序首先定义了一个实型函数aver ( ),其形参为实型数组a,长度为5。在函数aver()中,把各元素值相加求出平均值,返回给主函数。主函数main()中首先完成数组height各元素值的输入,然后以数组height作为实参调用aver()函数,函数返回值赋值给main ()函数中的av,最后输出av的值。从运行情况可以看出,程序实现了所要求的功能。
在变量作函数参数时,所进行的值传递是单向的。即只能从实参传向形参,而不能从形参传回实参。形参的初值和实参相同,形参的值发生改变后,实参并不变化,两者的值是不同的。当用数组名作函数参数时,情况则不同。由于实际上形参和实参为同一数组,因此当形参数组发生变化时,实参数组也随之变化。
用数组名作为函数参数时应注意以下几点。
(1)形参数组和实参数组的类型必须一致,否则将引起错误。
(2)形参数组和实参数组的长度可以不相同,因为在调用时,只传递首地址而不检查形参数组的长度。当形参数组的长度与实参数组不一致时,虽不至于出现语法错误(编译能通过),但程序执行结果将与实际不符,这是应予以注意的。
(3)在函数形参表中,允许不给出形参数组的长度,而用一个变量来表示数组元素的个数。例如,可以写为:
float aver( float a[ ] )
或
float aver( float a[ ] , int n)
其中,形参数组a没有给出长度,而由n的值动态地表示数组的长度。n的值由主调函数的实参进行传递。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。