购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.6.3 数组作为函数的参数

除了可以用变量作为函数的参数之外,还可以用数组名作为函数的参数。一个数组的数组名表示该数组的首地址。用一个数组名作为函数的参数时,在函数调用过程中参数传递方式采用的是地址传递,将实际参数数组的首地址传递给被调函数中的形式参数数组,这样一来两个数组就占用同一段内存单元。如图2.10所示,若数组a的起始地址为0x1000,则数组b的起始地址也是0x1000。

图2.10 两个数组占用同一段内存单元

用数组名作为函数的参数,应在主调函数和被调函数中分别进行数组定义,两个函数中定义的数组类型必须一致,不一致将导致编译出错。实参数组和形参数组的长度可以一致也可以不一致,编译器对形参数组的长度不做检查,只是将实参数组的首地址传递给形参数组。如果希望形参数组能得到实参数组的全部元素,则应使两个数组的长度一致。定义形参数组时可以不指定长度,只在数组名后面跟一个空的方括号“[]”。这时为了在被调函数中处理数组元素的需要,应另外设置一个参数来传递数组元素的个数。

例2-37 用数组作为函数的参数,计算两个不同长度数组中所有元素的平均值。

程序执行结果:

程序中定义了一个求平均值的函数average(),它有两个形式参数array和n。array是一个长度不定的float类型数组,n是int类型变量。在主函数main()中定义了两个长度确定的float类型数组pot_1[5]和pot_2[10]。通过嵌套函数调用实现求数组元素平均值。可以看到,两次调用average()函数时数组长度是不同的,调用时通过一个实际参数(5或10)将数组长度传递给形式参数n,使average()函数能处理数组pot_1和pot_2中的所有元素。

用数组名作为函数的参数,参数传递过程采用的是地址传递。地址传递方式具有双向传递的性质,即形式参数的变化将导致实际参数也发生变化,这种性质在程序设计中是很有用的。下面的例子就是利用这一性质来对数组a中的10个整数按从小到大的顺序排序。

例2-38 采用选择法对数组元素进行排序。

程序执行结果:

这个例子中,主程序在执行函数调用语句sort(a,10)的前后,数组a中各个元素的值是不同的。执行函数调用语句之前,数组a中的元素是无序的,执行函数调用语句之后,数组a中的元素已经按大小排序。这是因为在执行被调用函数时,形式参数数组已经进行了排序,而形式参数数组的改变会使实际参数数组随之改变,从而使主函数中的数组a也进行了排序。

对于多维数组作为函数的参数与一维数组的情形类似。可以用多维数组名作为函数的实际参数和形式参数,在被调用函数中对形式参数说明时可以指定每一维的长度,也可以省略数组第一维的长度说明,但是绝不能省略第二维以及其他高维的长度说明。因为从实际参数传送过来的是数组的起始地址,在内存中数组是按行存放的,而并不区分数组的行和列。如果在形式参数中不说明列数,编译器就无法确定该数组有几行几列。

例2-39 求一个3×4矩阵中的最大元素。

程序执行结果: aRILkotWi6VogPBzdwsoiaOB8iVzkPBE+rz1owYebIQVK/Ly0drEh1vtykYYk593

点击中间区域
呼出菜单
上一章
目录
下一章
×