二、数组名作为函数参数

  用数组名作函数参数与用数组元素作实参有几点不同:
1. 用数组元素作实参时,只需数组标准和函数的形参变量的标准不同,那么作为下标变量的数组元素的标准也和函数形参变量的标准是不同的。因而, 并不要求函数的形参也是下标变量。 换句话说,对数组元素的处置是按平居变量看待的。用数组名作函数参数时, 则要求形参和绝对应的实参都必需是标准相同的数组,都必需有年夜白的数组申明。当形参和实参二者不不同时,即会产生错误。

2. 在平居变量或下标变量作函数参数时,形参变量和实参变量是由编译琐屑分拨的两个差此外内存单元。在函数调用时产生的值传送是把实参变量的值付与形参变量。在用数组名作函数参数时,不是中止值的传送,即不是把实参数组的每一个元素的值都付与形参数组的各个元素。因为志向上形参数组并不存在,编译琐屑不为形参数组分拨内存。那么,数据的传送是怎样样完成的呢? 在第四章中我们曾先容过,数组名就是数组的首地点。因而在数组名作函数参数时所中止的传送只是地点的传送, 也就是说把实参数组的首地点付与形参数组名。形参数组名获得该首地点之后,也就即是有了实在的数组。志向上是形参数组和实参数组为不同数组,共同拥有一段内存空间。图5.1说熟悉打听这种景遇。图中设a为实参数组,标准为整型。a占有以2000 为首地点的一块内存区。b为形参数组名。当产生函数调用时,中止地点传送, 把实参数 组a的首地点传送给形参数组名b,于是b也获得该地点2000。 于是a,b两数组共同占有以2000 为首地点的一段连续内存单元。从图中还可以看出a和b下标相同的元素志向上也占相同的两个内
存单元(整型数组每个元素占二字节)。例如a[0]和b[0]都占用2000和2001单元,当然a[0]即是b[0]。类推则有a[i]即是b[i]。
[例5.5]数组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;
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);
}
float aver(float a[5])
{ ……
}
void main()
{
……
for(i=0;i<5;i )
scanf("%f",&sco[i]);
av=aver(sco);
……
}
  本步调起首定义了一个实型函数aver,有一个形参为实型数组a,长度为5。在函数aver中,把各元素值相加求出匀称值,前往给主函数。主函数main 中起首完成数组sco的输出,然后以sco作为实参调用aver函数,函数前往值送av,末了输出av值。 从运转景遇可以看出,步调完成了所要求的服从

3. 后面已经评论申辩过,在变量作函数参数时,所中止的值传送是单向的。即只能从实参传向形参,不克不及从形参传回实参。形参的初值和实参相同, 而形参的值产生改变后,实参并不厘革, 两者的终值是差此外。例5.3证清楚明晰这个结论。 而当用数组名作函数参数时,景遇则不同。 因为志向上形参和实参为不同数组, 因而当形参数组产生厘革时,实参数组也随之厘革。 当然这种景遇不克不及熟悉打听为产生了“双向”的值传递。但从现终究形来看,调用函数之后实参数组的值把因为形参数组值的厘革而厘革。为了申明这种景遇,把例5.4改为例5.6的方式。[例5.6]题目同5.4例。改用数组名作函数参数。
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]);
}
void nzp(int a[5])
{ ……
}
main()
{
int b[5],i;
……
nzp(b);
……
}
  本步调中函数nzp的形参为整数组a,长度为 5。 主函数中实参数组b也为整型,长度也为5。在主函数中起首输出数组b的值,然后输出数组b的初始值。 然后以数组名b为实参调用nzp函数。在nzp中,按要求把负值单元清0,并输出形参数组a的值。 前往主函数之后,再次输出数组b的值。从运转效果可以看出,数组b 的初值和终值是差此外,数组b 的终值和数组a是相同的。这申明实参形参为不同数组,它们的值同时得以改变。 用数组名作为函数参数时还应垂青以下几点:
a. 形参数组和实参数组的标准必需不同,否则把惹起错误。
b. 形参数组和实参数组的长度可以不相同,因为在调用时,只传送首地点而不反省形参数组的长度。当形参数组的长度与实参数组不不同时,虽不至于呈现语法错误(编译能经由),但步调施行效果把与志向不符,这是应予以垂青的。如把例5.6点窜如下:
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]);
}
  本步调与例5.6步调比,nzp函数的形参数组长度改为8,函数体中,for语句的轮回条件也改为i<8。因而,形参数组 a和实参数组b的长度不不同。编译可以经由,但从效果看,数组a的元素a[5],a[6],a[7]显然是有意义的。c. 在函数形参表中,允许不给出形参数组的长度,或用一个变量来显露数组元素的个数。
例如:可以写为:
void nzp(int a[])
或写为
void nzp(int a[],int n)
  此中形参数组a没有给出长度,而由n值静态地显露数组的长度。n的值由主调函数的实参中止传送。
由此,例5.6又可改为例5.7的方式。
[例5.7]
void nzp(int a[],int n)
{
int i;
printf("\nvalues of array a are:\n");
for(i=0;i<n;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]);
}
void nzp(int a[],int n)
{ ……
}
main()
{
……
nzp(b,5);
……
}
  本步调nzp函数形参数组a没有给出长度,由n 静态确定该长度。在main函数中,函数调用语句为nzp(b,5),此中实参5把付与形参n作为形参数组的长度。
d. 多维数组也可以作为函数的参数。 在函数定义时对形参数组可以指定每一维的长度,也可省去第一维的长度。因而,以下写法都是合法的。
int MA(int a[3][10])

int MA(int a[][10])

版权声明: 原创作品,允许转载,转载时请务必以超链接方式标明文章 原始出处 、作者信息和本声明。否则将清查执法责任。

转载于:https://www.cnblogs.com/zgqjymx/archive/2011/03/07/1975601.html

C言语教程第五章:函数(4)相关推荐

  1. C言语教程第五章:函数(1)

    概述 在第一章中曾经先容过,C源序次是由函数构成的. 固然在背面各章的序次中都只需一个主函数main(), 但实用序次每每由多个函数构成.函数是C源序次的根本模块, 经由历程对函数模块的挪用完成特定的 ...

  2. stata:stata软件教程(人大十八讲)(5) 第五章 函数与运算符

    第五章 函数与运算符 5.1 运算符 exp 5.1.1 代数运算 5.1.2 字符运算 5.1.3 关系运算 5.1.4 逻辑运算 5.2 函数概览 function 5.3 数学函数 5.3.1 ...

  3. AArch64教程第五章

    AArch64教程第五章 本章,我们将看看在aarch64中如何访问内存 内存 随机存储器,或者简单来说,内存是任一架构的必需部分.内存能够被看作由一系列连续的被称为地址的编号组成的数组,每一个元素都 ...

  4. 《Go语言圣经》学习笔记 第五章函数

    <Go语言圣经>学习笔记 第五章 函数 目录 函数声明 递归 多返回值 匿名函数 可变参数 Deferred函数 Panic异常 Recover捕获异常 注:学习<Go语言圣经> ...

  5. 【python第五章——函数】

    python第五章--函数 第五章--函数 5.1函数概述 5.2 函数进阶 下面部分之后再写 5.3函数习题(一些小例子) 第五章--函数 5.1函数概述 快速入门: #定义函数 def func( ...

  6. 思科计算机网络ppt,【思科网络课件】计算机网络双语教程第五章.ppt

    [思科网络课件]计算机网络双语教程第五章.ppt (27页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 14.90 积分 OSI Network Laye ...

  7. 计算机辅助设计应用教程,计算机辅助设计基础教程第五章.ppt

    计算机辅助设计基础教程第五章 第5章 3ds max 5.1 3ds max基础知识 5.2 对象的创建与编辑 5.3 复合对象的创建 5.4 NURBS建模 5.5 材质和贴图 5.6 摄影机.灯光 ...

  8. 第五章 函数和代码复用

    第五章 函数和代码复用 5.1 函数的基本使用 5.1.1 函数的定义 定义:函数是一段具有特定功能的.可重用的语句组,用函数名来表示并通过函数名进行功能调用. 使用函数的目的:降低编程难度和代码重用 ...

  9. stty详解-Unix/Linux编程实践教程第五章 学习stty

    读书笔记-第五章 连接控制 学习stty 先放上思维导图 为设备编程&设备就像文件 前面所学的知识都是基于文件的,而在unix/linux系统中,所有的设备(打印机,终端,话筒,摄像头等等)也 ...

  10. SQL基础教程第五章笔记

    第五章 复杂查询 5.1 视图 5.1.1 视图和表 从SQL的角度来看,视图和表是相同的.两者的区别在于表中保存的是实际的数据,而视图中保存的是SELECT语句.视图本身并不存储数据. 视图的优点: ...

最新文章

  1. shell 获取ora报错信息_频发:故障排除之又见 ORA-4031丨云和恩墨技术通讯
  2. Android应用开发经常使用知识
  3. H.264编码profile level控制
  4. android同步服务启动失败,android – FirebaseCloudMessaging:FirebaseInstanceId后台同步失败 – SERVICE_NOT_AVAILABLE...
  5. #{}不自动改参数类型_Spring参数的自解析还在自己转换?你out了!
  6. (libgdx学习)Polling
  7. ASPEN hysys焓值、熵值转化换算
  8. 基于ifix组态软件研究控制按钮权限
  9. 散文:dflow 是如何实现slice的
  10. (result, consumed) = self._buffer_decode(data, self.errors, final)报错
  11. 并不对劲的bzoj1095:p2056:[ZJOI2007]捉迷藏
  12. 容器化与无状态微服务等
  13. Python得到前面12个月的数据
  14. mysql中in的参数有限制_数据库 in 可以包含的参数个数
  15. 福昕阅读器无法添加书签
  16. opencv报错—error C2872: ACCESS_MASK: 不明确的符号
  17. 你视人家为人脉,人家视你为韭菜
  18. Leetcode_577_员工奖金_SQL
  19. 数据库第一范式、第二范式、第三范式、BCNF范式
  20. configure: error: Requested 'libcrypto = 1.1.0' but version of OpenSSL-libcrypto is 1.0.2g

热门文章

  1. 不当IT民工——技术带来质的飞跃
  2. VScode使用记录二:Windows 7下安装GCC、使用VSCode编译代码
  3. event loop一篇文章足矣
  4. POJ 1151 Atlantis 矩形面积求交/线段树扫描线
  5. bzoj3067: Hyperdrome
  6. [Swift]LeetCode229. 求众数 II | Majority Element II
  7. iframe 自适应内容高度
  8. javascript中实现动画是settimeout(递归)还是用setinterval好?
  9. [转]Ubuntu下快速安装python
  10. SEO思维的优化源于生活