任务描述
在前面的2 个项目中,基本上都是以简单变量作为函数的参数。在实际编程中数组也可以作为函数的参数。但它和简单变量作为函数的参数,作用上却有很大的不同。本任务要求掌握数组作为函数的参数,在程序设计中的设计、编写以及特征。
知识学习
(1)数组元素作为函数的参数
数组元素作为参数和变量作为参数是一样的,把作为实参的数组元素的值传送给形参,实现单向的值传送。但是数组元素一般在函数中只用于实参,不能用于形参。
例5.13 某公司的财务部由于获得的公司年终考评优秀的等级,公司决定给予奖励,每位员工的基本工资上调10%。输入该部门6 位员工的基本工资,计算并输出奖励后每个人的基本工资。
图5.15 程序运行结果
说明:本程序定义了一个f 函数,形参是一个double 型的变量x。一旦f 函数被调用,形参x 将会被赋给实参a[i]的值,再进行计算,然后将结果使用return 语句返回到主函数调用f 函数处,最后再将返回值赋值于原本数组元素a[i]。
(2)数组作为函数的参数
数组作为参数和数组元素作为参数有几点不同:
①数组名也可以作为函数的实参,跟数组元素作实参时不一样,此时不是把数组的值传递给形参,而是把实参数组的起始地址传给形参数组,即“传递地址”。这样实际上是形参数组与实参数组共同占用同一块存储空间,从而使得在函数内如果形参数组的元素的值发生了改变,那么实参数组也发生改变。
②在普通变量或下标变量作函数参数时,形参变量和实参变量是由编译系统分配的两个不同的内存单元。在函数调用时发生的值传送是把实参变量的值赋予形参变量。在用数组名作函数参数时,不是进行值的传送,即不是把实参数组的每一个元素的值都赋予形参数组的各个元素。因为实际上形参数组并不存在,编译系统不为形参数组分配内存。那么,数据的传送是如何实现的呢? 我们曾介绍过,数组名就是数组的首地址。因此在数组名作函数参数时所进行的传送只是地址的传送,也就是说把实参数组的首地址赋予形参数组名。形参数组名取得该首地址之后,也就等于有了实在的数组。实际上是形参数组和实参数组为同一数组,共同拥有一段内存空间。
如有一维数组double a[6] 做函数参数时,必须注意以下事项:
①数组做函数的形参时,使用数组的定义形式,例如:double a[6]或者double a[]。
②数组做函数的实参时,使用数组名的形式,例如:a。
③形参的数组名可以与实参的数组名不相同。
例5.14 输出一位数组a 的所有数组元素在内存中的首地址。
图5.16 程序运行结果
说明:此例题主要是说明数组元素在内存中是连续存储,加之数组名等价于该数组首元素的首地址。如果要访问一个数组中所有的数组元素,已知数组名即可。
例5.15 任意输入一间寝室6 位同学的身高,求平均身高。要求功能用自定义函数来实现。
(www.xing528.com)
图5.17 程序运行结果
说明:依据一维数组的特点①数组中所有数组元素数据类型一致,存储空间大小一样。②数组中所有数组元素在内存中是连续存储。③数组名等价于该数组首元素的首地址。所以当在main 函数中调用compute 函数时,实际参数数组名a 也就是该数组的首元素的首地址&a[0]将其值传递给形参的数组b。使得数组a 和数组b 共同使用数组a 原本在内存的存储空间。相当于a[0]等价b[0],也就是推导出a[i]等价b[i],见表5.1。
表5.1 数组a 和数组b 数组元素、数组元素的值、数组元素的首地址
任务总结
提醒在编写函数且参数使用数组时需要注意以下几点:
①形参数组和实参数组的类型必须一致,否则将引起错误。
②形参数组和实参数组的长度可以不相同,因为在调用时,只传送首地址而不检查形参数组的长度。当形参数组的长度与实参数组不一致时,虽不至于出现语法错误(编译能通过),但程序执行结果将与实际不符,这是应予以注意的。
③当形参和实参都为数组时,因此当形参数组发生变化时,实参数组也随之变化。
④在函数形参表中,允许可以给出形参数组的长度、不给出形参数组的长度,或用一个变量来表示数组元素的个数。
例如,可以写为:
void f(double b[6])
或写为
void f(double b[])
或写为
void f(double b[],int n)
其中形参数组b 没有给出长度,而由n 值动态地表示数组的长度。n 的值由主调函数的实参进行传送。
⑤多维数组也可以作为函数的参数。在函数定义时对形参数组可以指定每一维的长度,也可省去第一维的长度。因此,以下写法都是合法的。
double max(int b[30][6])
或
double max(int b[][6])。
⑥上述3 点同样适用于二维数组做函数的参数。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。