【时时三省】(C语言基础)一维数组名作函数参数
山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省
除了可以用数组元素作为函数参数外,还可以用数组名作函数参数(包括实参和形参)。
注意:用数组元素作实参时;向形参变量传递的是数组元素的值,而用数组名作函数实参时,向形参(数组名或指针变量)传递的是数组首元素的地址。
例题:
有一个一维数组score,内放10个学生成绩,求平均成绩。
解题思路:
用一个函数average来求平均成绩,不用数组元素作为函数实参,而是用数组名作为函数实参,形参也用数组名,在average函数中引用各数组元素,求平均成绩并返回main函数。
编写程序:
运行结果:
程序分析:
( 1 )用数组名作函数参数,应该在主调函数和被调用函数分别定义数组,例中array是形参数组名,score是实参数组名,分别在其所在函数中定义,不能只在一方定义。
( 2 )实参数组与形参数组类型应一致(今都为float型),如不一致,结果将出错。
( 3 )在定义average函数时,声明形参数组的大小为10,但在实际上,指定其大小是不起任何作用的,因为C语言编译系统并不检查形参数组大小,只是将实参数组的首元素的地址传给形参数组名。形参数组名获得了实参数组的首元素的地址,前已说明,数组名代表数组的首元素的地址,因此,可以认为,形参数组首元素( array [ 0 ] )和实参数组首元素( score [ 0 ] )具有同一地址,它们共占同一存储单元,score [ n ]和array [ n ]指的是同一单元。score [ n ]和array [ n ]具有相同的值。
( 4 )形参数组可以不指定大小,在定义数组时在数组名后面跟一个空的方括号,如:
float average ( float array [] )
/ /定义average函数,形参数组不指定大小
效果是相同的。
例题2:
有两个班级,分别有35名和30名学生,调用一个average函数,分别求这两个班的学生的平均成绩。
解题思路:
上例已解决了求一个有确定长度的数组的平均值的问题。现在需要解决的是怎样用同一个函数求两个不同长度的数组的平均值的问题。在定义average函数时不必指定数组的长度,在形参表中增加一个整型变量i,从主函数把数组的实际长度分别从实参传递给形参i。这个i用来在average函数中控制循环的次数。这就解决了用同一个函数求两个不同长度的数组的平均值问题。
为简化,设两个班的学生数分别为5和10。
编写程序:
运行结果:
程序分析:
程序的作用是分别求出数组scorel(有5个元素)和数组score2(有10个元素)各元素的平均值。两次调用average函数时需要处理的数组元素个数是不同的,在第一次调用时将实参(值为5)传递给形参n,表示求5个学生的平均分。第2次调用时,求10个学生的平均分。
注意:用数组名作函数实参时,不是把数组元素的值传递给形参,而是把实参数组的首元素的地址传递给形参数组,这样两个数组就共占同一段内存单元。如果实参数组为a,形参数组为b若a的首元素的地址为1000 ,则b数组首元素的地址也是1000,显然,a [ 0 ]与b [ 0 ]同占一个单元……假如改变了b [ 0 ]的值,也就意味着a[0]的值也改变了。也就是说,形参数组中各元素的值如发生变化会使实参数组元素的值同时发生变化。这一点是与变量作函数参数的情况不同的,务请注意。在程序中常有意识地利用这一特点改变实参数组元素的值(如排序)。
例题3:
用选择法对数组中10个整数按由小到大排序。
解题思路:
所谓选择法就是先将10个数中最小的数与a [ 0 ]对换;再将a [ 1 ] ~ a [ 9 ]中最小的数与a1 ]对换…每比较一轮,找出一个未经排序的数中最小的一个。共比较9轮。
编写程序:
运行结果:
程序分析:
可以看到在执行函数调用语句“sort ( a,10 );”之前和之后,a数组中各元素的值是不同的。原来是无序的,执行“sort ( a,10 );”后,a数组已经排好序了,这是由于形参数组array已用选择法进行排序了,形参数组改变也使实参数组随之改变。