C语言设计

第29章


类推则有 a[i]等于 b[i]。
【例 8.8】数组 a 中存放了一个学生 5 门课程的成绩,求平均成绩。
float aver(float a[5])
{
    int i;
    float av,s=a[0];
    for(i=1;i<5;i++)
      s=s+a[i];
    av=s/5;
    return av;
}
void main()
{
    float sco[5],av;
    int i;
谭浩强      C 语言程序设计               2001 年 5 月 1 日
    printf(" input 5 scores: ");
    for(i=0;i<5;i++)
      scanf("%f",&sco[i]);
    av=aver(sco);
    printf("average score is %5.2f",av);
}
本程序首先定义了一个实型函数 aver,有一个形参为实型数组 a,长度为 5。在函
数 aver 中,把各元素值相加求出平均值,返回给主函数。主函数 main 中首先完成数
组 sco 的输入,然后以 sco 作为实参调用 aver 函数,函数返回值送 av,最后输出 av
值。 从运行情况可以看出,程序实现了所要求的功能。
3) 前面已经讨论过,在变量作函数参数时,所进行的值传送是单向的。即只能从实参
传向形参,不能从形参传回实参。形参的初值和实参相同,而形参的值发生改变后,
实参并不变化,两者的终值是不同的。而当用数组名作函数参数时,情况则不同。
由于实际上形参和实参为同一数组,因此当形参数组发生变化时,实参数组也随之
变化。当然这种情况不能理解为发生了“双向”的值传递。但从实际情况来看,调
用函数之后实参数组的值将由于形参数组值的变化而变化。为了说明这种情况,把
例 5.4 改为例 5.6 的形式。
【例 8.9】题目同 8.7 例。改用数组名作函数参数。
void nzp(int a[5])
{
    int i;
    printf(" values of array a are: ");
    for(i=0;i<5;i++)
    {
if(a[i]<0) a[i]=0;
printf("%d ",a[i]);
    }
}
main()
{
    int b[5],i;
    printf(" input 5 numbers: ");
    for(i=0;i<5;i++)
      scanf("%d",&b[i]);
    printf("initial values of array b are: ");
    for(i=0;i<5;i++)
      printf("%d ",b[i]);
    nzp(b);
    printf(" last values of array b are: ");
    for(i=0;i<5;i++)
      printf("%d ",b[i]);
}
谭浩强      C 语言程序设计               2001 年 5 月 1 日
本程序中函数 nzp 的形参为整数组 a,长度为 5。主函数中实参数组 b 也为整型,长度
也为 5。在主函数中首先输入数组 b 的值,然后输出数组 b 的初始值。然后以数组名 b 为实
参调用 nzp 函数。在 nzp 中,按要求把负值单元清 0,并输出形参数组 a 的值。 返回主函
数之后,再次输出数组 b 的值。从运行结果可以看出,数组 b 的初值和终值是不同的,数组
b 的终值和数组 a 是相同的。这说明实参形参为同一数组,它们的值同时得以改变。
用数组名作为函数参数时还应注意以下几点:
a. 形参数组和实参数组的类型必须一致,否则将引起错误。
b. 形参数组和实参数组的长度可以不相同,因为在调用时,只传送首地址而不检
查形参数组的长度。当形参数组的长度与实参数组不一致时,虽不至于出现语
法错误(编译能通过),但程序执行结果将与实际不符,这是应予以注意的。
【例 8.10】如把例 8.9 修改如下:
void nzp(int a[8])
{
    int i;
    printf(" values of array aare: ");
    for(i=0;i<8;i++)
    {
      if(a[i]<0)a[i]=0;
      printf("%d ",a[i]);
    }
}
main()
{
    int b[5],i;
    printf(" input 5 numbers: ");
    for(i=0;i<5;i++)
      scanf("%d",&b[i]);
    printf("initial values of array b are: ");
    for(i=0;i<5;i++)
      printf("%d ",b[i]);
    nzp(b);
    printf(" last values of array b are: ");
    for(i=0;i<5;i++)
      printf("%d ",b[i]);
}
本程序与例 8.9 程序比,nzp 函数的形参数组长度改为 8,函数体中,for 语句的循环
条件也改为 i<8。因此,形参数组 a 和实参数组 b 的长度不一致。编译能够通过,但从结果
谭浩强      C 语言程序设计               2001 年 5 月 1 日
看,数组 a 的元素 a[5],a[6],a[7]显然是无意义的。
c. 在函数形参表中,允许不给出形参数组的长度,或用一个变量来表示数组元素
的个数。
例如,可以写为:
void nzp(int a[])
或写为
void nzp(int a[],int n)
其中形参数组 a 没有给出长度,而由 n 值动态地表示数组的长度。n 的值由主
调函数的实参进行传送。
由此,例 8.10 又可改为例 8.11 的形式。
【例 8.11】
void nzp(int a[],int n)
{
    int i;
    printf(" values of array a are: ");
    for(i=0;i
小说推荐
返回首页返回目录