当前位置 首页 紫川 第三节

《紫川》第三节

作者:老猪 字数:2690 书籍:紫川

  类推则有 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("\ninput 5 scores:\n");

  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("\nvalues of array a are:\n");

  for(i=0;i<5;i++)

  {

  if(a[i]<0) a[i]=0;

  printf("%d ",a[i]);

  }

  }

  main()

  {

  int b[5],i;

  printf("\ninput 5 numbers:\n");

  for(i=0;i<5;i++)

  scanf("%d",&b[i]);

  printf("initial values of array b are:\n");

  for(i=0;i<5;i++)

  printf("%d ",b[i]);

  nzp(b);

  printf("\nlast values of array b are:\n");

  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("\nvalues of array aare:\n");

  for(i=0;i<8;i++)

  {

  if(a[i]<0)a[i]=0;

  printf("%d ",a[i]);

  }

  }

  main()

  {

  int b[5],i;

  printf("\ninput 5 numbers:\n");

  for(i=0;i<5;i++)

  scanf("%d",&b[i]);

  printf("initial values of array b are:\n");

  for(i=0;i<5;i++)

  printf("%d ",b[i]);

  nzp(b);

  printf("\nlast values of array b are:\n");

  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("\nvalues of array a are:\n");

  for(i=0;i

  {

  if(a[i]<0) a[i]=0;

  printf("%d ",a[i]);

  }

  }

  main()

  {

  int b[5],i;

  printf("\ninput 5 numbers:\n");

  for(i=0;i<5;i++)

  scanf("%d",&b[i]);

  printf("initial values of array b are:\n");

  for(i=0;i<5;i++)

  printf("%d ",b[i]);

  nzp(b,5);

  printf("\nlast values of array b are:\n");

  for(i=0;i<5;i++)

  printf("%d ",b[i]);

  }

  本程序 nzp 函数形参数组 a 没有给出长度,由 n 动态确定该长度。在 main 函数中,函

  数调用语句为 nzp(b,5),其中实参 5 将赋予形参 n 作为形参数组的长度。

  d. 多维数组也可以作为函数的参数。在函数定义时对形参数组可以指定每一维的

  长度,也可省去第一维的长度。因此,以下写法都是合法的。

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

  或

  int MA(int a[10])。

  8.8 局部变量和全局变量

  谭浩强 C 语言程序设计 2001 年 5 月 1 日

  在讨论函数的形参变量时曾经提到,形参变量只在被调用期间才分配内存单元,调用结

  束立即释放。

目录
设置
设置
阅读主题
字体风格
雅黑 宋体 楷书 卡通
字体风格
适中 偏大 超大
保存设置
恢复默认
听书
听书
发声
男声 女生 逍遥 软萌 粤语 陕西 台语 辽宁
语速
适中 超快
音量
适中
开始播放
手机
手机阅读
扫码获取链接,使用浏览器打开
书架同步,随时随地,手机阅读
收藏
反馈
章节报错
当前章节
报错内容
提交
加入收藏 < 上一章 回到书页 下一章 > 错误反馈

设为首页加入收藏保存桌面网址发布会员中心留言本

Copyright © 2024-2025 All Rights Reserved