零基础入门学习C语言008讲:函数(4)

缺乏、安全感 2022-04-25 01:10 298阅读 0赞

8.7数组作为函数参数

数组可以作为函数的参数使用,进行数据传送。数组用作函数参数有两种形式。

一种是把数组元素(下标变量)作为实参使用;

另一种是把数组名作为函数的形参和实参使用。

8.7.1 数组元素作函数实参

数组元素就是下标变量,它与普通变量并无区别。因此它作为函数实参使用与普通变量是完全相同的,在发生函数调用时,把作为实参的数组元素的值传送给形参,实现单向的值传送。

例题训练

判别一个整数数组a[10]={1, 2, 3, 4, -1, -2, -3, -4, 2, 3}中各元素的值,若大于0 则输出该值,若小于等于0则输出0值。

  1. #include "stdio.h"
  2. void test(int v);
  3. void main()
  4. {
  5. int a[10] = { 1, 2, 3, 4, -1, -2, -3, -4, 2, 3 };
  6. int i;
  7. for (i = 0; i < 10; i++)
  8. {
  9. test(a[i]);
  10. }
  11. printf("\n");
  12. }
  13. void test(int v)
  14. {
  15. if (v>0)
  16. {
  17. printf("%d ", v);
  18. }
  19. else
  20. {
  21. printf("%d ", 0);
  22. }
  23. }

8.7.2 数组名作函数参数

用数组名作函数参数与用数组元素作实参有几点不同:

1) 用数组元素作实参时,只要数组类型和函数的形参变量的类型一致,那么作为下标变量的数组元素的类型也和函数形参变量的类型是一致的。因此,并不要求函数的形参也是下标变量。换句话说,对数组元素的处理是按普通变量对待的。

然而,用数组名作函数参数时,则要求形参和相对应的实参都必须是类型相同的数组,都必须有明确的数组说明。当形参和实参二者不一致时,即会发生错误。

2) 在普通变量或下标变量作函数参数时,形参变量和实参变量是由编译系统分配的两个不同的内存单元。在函数调用时发生的值传送是把实参变量的值赋予形参变量。

在用数组名作函数参数时,不是进行值的传送,即不是把实参数组的每一个元素的值都赋予形参数组的各个元素。

为什么?

因为实际上形参数组并不存在,编译系统不为形参数组分配内存。

那么,数据的传送是如何实现的呢?

在此之前我们曾介绍过,数组名就是数组的首地址。因此在数组名作函数参数时所进行的传送只是地址的传送,也就是说把实参数组的首地址赋予形参数组名。

形参数组名取得该首地址之后,也就等于有了实在的数组。实际上是形参数组和实参数组为同一数组,共同拥有一段内存空间。

  1. #include <stdio.h>
  2. void test(int b[10]);
  3. void main()
  4. {
  5. int a[10] = { 2, 4, 6, 8, 10, 12, 14, 16, 18, 20 };
  6. test(a);
  7. putchar('\n');
  8. }
  9. void test(int b[10])
  10. {
  11. int i = 0;
  12. for (; i < 5; i++)
  13. {
  14. printf("%d ", b[i]);
  15. }
  16. }

内存数组的存储:

20190430205454622.png

思考并讨论以下例题:

有一个一维数组score,内放10个学生成绩,求平均成绩(写一个average函数求平均成绩)。

  1. #include <stdio.h>
  2. double average(double array[10]); /* 函数声明 */
  3. void main()
  4. {
  5. double score[10] = { 82, 100, 87.5, 89, 78, 85, 67.5, 92.5, 93, 94 }, result;
  6. result = average(score);
  7. printf("average score is %5.2lf\n", result);
  8. putchar('\n');
  9. }
  10. double average(double array[10])
  11. {
  12. double result = 0;
  13. int i = 0;
  14. for (i = 0; i < 10; i++)
  15. {
  16. result += array[i];
  17. }
  18. result /= 10;
  19. return result;
  20. }

形参数组不定义长度

Let me try!!

  1. #include <stdio.h>
  2. double average(double array[]); /* 函数声明 */ //形参数组不定义长度
  3. void main()
  4. {
  5. double score[10] = { 82, 100, 87.5, 89, 78, 85, 67.5, 92.5, 93, 94 }, result;
  6. result = average(score);
  7. printf("average score is %5.2lf\n", result);
  8. putchar('\n');
  9. }
  10. double average(double array[])//形参数组不定义长度
  11. {
  12. double result = 0;
  13. int i = 0;
  14. for (i = 0; i < 10; i++)
  15. {
  16. result += array[i];
  17. }
  18. result /= 10;
  19. return result;
  20. }

发表评论

表情:
评论列表 (有 0 条评论,298人围观)

还没有评论,来说两句吧...

相关阅读