6.4 数组作为函数的参数
数组作为函数的参数主要有两种情况:
第一种情况,数组元素作为函数的实参。这种情况与普通变量作实参一样,是将数组元素的值传给形参,这种参数传递方式为“值传递”。
第二种情况,数组名作为函数的实参。要求函数形参是与实参相同类型的数组名(或指向数组的指针变量,详见第7章),将实参数组的起始地址(数组名代表数组的起始地址)传给形参数组,这种参数传递方式为“地址传递”。
“值传递”与“地址传递”的形实参数结合的区别可以用图6-10表示。
图6-10 两种传递方式的示意图
从图6-10中我们可以看出,图(a)中形参y获得实参x[0]的数据值55后,形参与实参再没有任何关联,因此,形参的值如果发生改变,不会影响到实参的值。
图(b)中形参y获得的只是实参x(为数组名)的起始地址指针,y指向x所在的存储单元,对y进行操作实际上就是到数组x所在的存储空间去进行操作,因此,形参数组的值如果发生改变,就会影响到实参数组值的改变。
如果在调用的函数中对形参执行加9操作,其结果如图6-11所示。
图6-11 调用函数中执行加9后的示意图
显然,两种传送方式对实参的影响结果不一样。
1.数组元素作函数的实参
数组元素作为函数实参与简单变量作为函数实参相同,是将元素的值传给被调函数的形参,是单向值传递。
例6.15 从键盘上输入一行英文,统计出该行英文中小写元音字母a、e、i、o、u的个数。设计一个函数aeiou(),判断该行英文中各字母是否为小写元音字母。
程序如下:
程序运行结果如下:
程序中实参str [i]与形参c1之间是值传递。
2.数组名作函数参数
数组名作函数参数是把实参数组的起始地址传给了形参数组,即形参数组与实参数组对应同一段内存单元,利用这个特点,可得到多个返回值。
例6.16 从一个3行4列的矩阵中找出最大值与最小值,并把它们分别放在第一、第二个元素中。
程序运行结果如下:
说明:
①数组名作函数参数时,形参与实参都应使用数组名,且分别在被调用函数与主调函数中说明。
②实参与形参类型要一致。
③实参数组与形参数组大小可以不一致,形参数组可不指定大小。C编译程序不检查形参数组的大小。
④对一维形参数组名,在定义时,数组名后面可只跟一对空方括号。
例如:
对多维数组而言,形参的第一维可不指定,但其他维必须指定。如上例中定义形参时可以改成:void maxmin(int b[][4])。
通常为了在被调用函数中更加方便地处理数组元素,可另设一参数来传递数组元素个数。
例如:
例6.17 改写例6.6“用选择排序法,从键盘上任意输入10个整数从大到小地进行排序,并在屏幕上显示出来”,将其中的排序部分改为一个函数void sort(int b[],int k),输入的整数个数由10个改成为任意个(100以内)且由参数k传递,在主函数中完成输入和输出。
程序如下:
程序运行结果如下:
例6.18 利用插入排序法对字符串中的字符按从小到大的顺序进行排序。
插入排序法的基本算法是:先对字符串中的头两个元素进行排序;然后把第三个字符插入到前两个字符中,插入后前三个字符依然有序;再把第四个字符插入到前三个字符中……
如果待插入的字符比前已排好序字符串的最后一个字符小,则要通过逐一比较找到该字符的插入点,大的字符要往后挪动;如果待插入的字符比前面已排好序字符串的最后一个字符大,则不需要挪动。
例如有一排好序的字符串ABGH,如待插入字符为D,将D逐一与H、G比较,H、G往后挪动。如待插入字符为'K',则不需要挪动。
假定待排序的字符串已在主函数中赋予,函数fun完成插入排序,程序如下:
程序运行结果如下:
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。