用函数实现模块化程序设计四

打印 上一主题 下一主题

主题 888|帖子 888|积分 2664

数组作为函数参数

调用有参函数时,需要提供实参,实参可以是常量、变量或表达式
数组元素的作用与变量相称,一样平常来说,凡是变量可以出现的地方,都可以用数组元素代替,因此,数组元素也可以用作函数实参,其用法与变量相同,向形参船体数组元素的值。此外,数组名也可以作实参和形参,传递的是数组第一个元素的地点
数组元素作函数实参

数组元素可以用作函数实参,不能用作形参。因为形参是在函数被调用时临时分配存储单元的,不可能为一个数组元素单独分配存储单元(数组是一个整体,在内存中占连续的一段存储单元)
在用数组元素作函数实参时,把实参的值传给形参,是“值传递”方式。数据传递的方向是从实参传到形参,单向传递
例:输入10个数,要求输出此中值最大的元素和该数是第几个数
  1. #include <stdio.h>
  2. #include <string.h>
  3. int maxNum(int m, int n)//取最大值
  4. {
  5.         return m > n ? m : n;
  6. }
  7. int main(void)
  8. {
  9.         int arr[10];//定义
  10.         memset(arr, 0, sizeof(arr));//初始化
  11.        
  12.         for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)//输入
  13.                 scanf("%d", &arr[i]);
  14.         int iMax = arr[0];
  15.         int iIndex = 1;
  16.         for (int i = 1; i < sizeof(arr) / sizeof(arr[0]); i++)
  17.         {
  18.                 if (iMax >= maxNum(iMax, arr[i]))
  19.                         continue;
  20.                 iMax = arr[i];
  21.                 iIndex = i + 1;
  22.         }
  23.         printf("\n%d\n%d\n", iMax, iIndex);//输出
  24.         return 0;
  25. }
复制代码
在VS编译器内会报C4996错误,解决见下文:(下同)
C4996 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. - EricsT - 博客园 (cnblogs.com)
运行效果:

数组名作为函数参数

除了可以用数组元素作为函数参数外,还可以用数组名作为函数参数(包括实参和形参)
用数组元素作为实参时,向形参变量传递的是数组元素的值,而用数组名作函数实参时,向形参(数组名或指针变量)传递的是数组首元素的地点
例:有一个一维数组 score 内放 10 个学生成绩,求平均成绩
  1. #include <stdio.h>
  2. #include <string.h>
  3. float ave(float score[], size_t iSize)
  4. {
  5.         float fRet = 0;
  6.         for (int i = 0; i < iSize; i++)//求和
  7.                 fRet += score[i];
  8.        
  9.         return fRet / iSize;//平均值
  10. }
  11. int main(void)
  12. {
  13.         float score[10];//定义
  14.         memset(score, 0, sizeof(score));//初始化
  15.        
  16.         for (int i = 0; i < sizeof(score) / sizeof(score[0]); i++)//赋值
  17.                 scanf("%f", &score[i]);
  18.         printf("\n%f\n", ave(score, sizeof(score) / sizeof(score[0])));//平均值
  19.         return 0;
  20. }
复制代码
运行效果:

用数组名作函数参数,应该是在主调函数和被调函数分别定义数组
实参数组与形参数组类型应该同等
C语言编译系统并不检查形参数组的大小,只是将实参数组的首元素的地点传给形参数组名。因此形参数组首元素和实参数组首元素是有同一地点,它们共占同一存储单元
形参数组可以不指定大小,在定义数组时在数组名后面跟一个空的方括号
用数组名作为函数实参时,不是把数组元素的值传递给形参,而是把实参数组的首元素地点传递给形参数组,这样子两个数组就共占同一段内存单元,所以形参数组元素的值改变,则实参数组元素对应的值也会改变
多维数组名作函数参数

多维数组元素可以作函数参数
可以用多维数组名作为函数的实参和形参,在被调用函数中对形参数组定义时可以指定每一维的大小,也可以省略第一维的大小
例:有一个3*4的矩阵,求所有元素中的最大值
  1. #include <stdio.h>
  2. int maxNum(int num[][4], size_t iSize)
  3. {
  4.         int iMax = num[0][0];
  5.         for (int i = 0; i < iSize; i++)
  6.                 for (int j = 0; j < 4; j++)
  7.                         iMax = iMax > num[i][j] ? iMax : num[i][j];
  8.         return iMax;
  9. }
  10. int main(void)
  11. {
  12.         int num[3][4] =
  13.         {
  14.                 { 1, 3, 5, 7 },
  15.                 { 2, 4, 6, 8 },
  16.                 { 15, 17, 34, 12 }
  17.         };
  18.         printf("\n%d\n", maxNum(num, 3));
  19.         return 0;
  20. }
复制代码
运行效果:


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

玛卡巴卡的卡巴卡玛

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表