首页 理论教育C语言程序设计第2版:数组名作为函数参数

C语言程序设计第2版:数组名作为函数参数

【摘要】:而当用数组名作函数参数时,情况则不同。由于实际上形参和实参为同一数组,因此当形参数组发生变化时,实参数组也随之变化。本程序与例5.5程序相比,aver()函数的形参数组长度改为8,而在函数体中,for语句的循环条件也改为i<8。因此,形参数组a和实参数组sco的长度不一致。例5.7把例5.5程序中的函数的形参数组不指定长度,并改写程序。

数组名作函数参数时,实参与形参都应用数组名。

例5.5 数组a中存放了一个学生5门课程的成绩,求平均成绩。

本程序首先定义了一个实型函数aver(),有一个形参为实型数组a,长度为5。在函数aver()中,把各元素值相加求出平均值并返回给主函数。主函数main()中首先完成数组sco的输入,然后以sco为实参调用aver()函数,函数返回值送av,最后输出av值。从运行情况可以看出,该程序实现了所要求的功能。

前面已经讨论过,在变量作函数参数时,所进行的值传送是单向的(即只能从实参传向形参,不能从形参传回实参)。形参的初值和实参相同,而形参的值发生改变后,实参并不变化,两者的终值是不同的。

而当用数组名作函数参数时,情况则不同。由于实际上形参和实参为同一数组,因此当形参数组发生变化时,实参数组也随之变化。当然这种情况不能理解为发生了“双向”的值传递。但从实际情况来看,调用函数之后实参数组的值将随着形参数组值的变化而变化。

形参数组和实参数组的长度可以不相同,因为在调用时程序只传送首地址而不检查形参数组的长度。当形参数组的长度与实参数组不一致时,虽不至于出现语法错误(编译能通过),但程序执行结果将与实际不符,这是应予以注意的。

例5.6 把例5.5程序中的形参数组与实参数组的长度修改为一致,并重写程序。

本程序与例5.5程序相比,aver()函数的形参数组长度改为8,而在函数体中,for语句的循环条件也改为i<8。因此,形参数组a和实参数组sco的长度不一致。编译能够通过,但从结果看,数组a的元素a[5],a[6],a[7]数值将会导致程序运行出现错误结果。

在函数形参表中,允许不给出形参数组的长度,或用一个变量来表示数组元素的个数。例如,函数声明可以写为:

void aver(int a[])(www.chuimin.cn)

void aver(int a[],int n)

其中,形参数组a没有给出长度,而由n的值动态地表示数组的长度。n的值由主调函数的实参进行传送。由此,例5.5又可改为例5.7的形式。

例5.7 把例5.5程序中的函数的形参数组不指定长度,并改写程序。

本程序aver()函数形参数组a没有给出长度,而由n动态确定该长度。在main()函数中,函数调用语句为aver(sco,5),其中实参5将赋值给形参n作为形参数组的长度。

多维数组也可以作为函数的参数。在函数定义时,形参数组可以指定每一维的长度,也可省去第一维的长度。因此,以下写法都是合法的。

int MA(int a[3][10])

int MA(int a[][10])。