7.7 数组作为函数参数
概述
在 C 语言编程中,数组作为一种重要的数据结构,不仅能存储多个数据元素,还可以作为整体或通过其元素单独传递给函数。当数组作为参数传递给函数时,传递的实际上是数组首元素的地址,这使得函数能够通过原始数据进行操作,而不仅仅是复制其值。
数组元素作为函数实参
虽然数组元素可以作为实参传递给函数,但它们不能单独作为形参来接收数据,因为形参通常是临时的存储单元,而数组元素是数组整体的一部分。当数组元素传递给函数时,采用的是值传递的方式,即传递元素值的副本。
示例程序:找出数组中的最大值
题目描述
编写一个程序,输入10个整数,输出其中最大的数及其在数组中的位置。
解题思路
程序可以定义一个长度为10的整型数组来存储这些数字。通过一个名为 max
的函数来求解两个数中较大的一个。在主函数中,使用变量 m
来存储当前已知的最大值,初始设为数组的第一个元素 a[0]
。随后,逐一比较数组中的其他元素,更新最大值。
C 语言实现
#include <stdio.h>
int max(int x, int y) {
return (x > y) ? x : y;
}
int main() {
int a[10], m, n, i;
printf("Enter 10 integer numbers: ");
for (i = 0; i < 10; i++) {
scanf("%d", &a[i]);
}
for (i = 1, m = a[0], n = 0; i < 10; i++) {
if (max(m, a[i]) > m) {
m = max(m, a[i]);
n = i;
}
}
printf("The largest number is %d\nIt is the %d-th number.\n", m, n + 1);
return 0;
}
程序分析
该程序首先从键盘接收10个整数并存储在数组 a[0]
至 a[9]
中。变量 m
用于存储当前已知的最大数。初始时,m
的值设置为 a[0]
,然后程序将 m
与 a[1]
到 a[9]
的元素逐一比较,适时更新 m
的值。通过9次循环比较后,m
的值即为数组中的最大数。变量 n
用来记录最大数的索引,最终输出最大数和它的位置(位置计数从1开始)。
讨论
通过上述示例,我们可以看到数组元素作为函数实参的用法是非常直观且功能强大的。这种方法不仅增加了代码的模块化,还提高了代码的可读性和可维护性。使用函数处理数组元素可以使主程序更加简洁,并且可以在不影响原始数据的情况下重复使用函数逻辑。
7.7.2 一维数组名作函数参数
概念介绍
在 C 语言中,数组名可以作为函数的实参和形参。使用数组名作为实参时,传递的是数组首元素的地址,而非整个数组的拷贝。这种传递方式效率较高,因为它避免了大量数据的复制。形参接收这个地址,从而可以在函数内部直接访问和修改原始数组的元素。
数组作为函数参数的示例
示例描述
假设有一个一维数组 score
,存储了10个学生的成绩,目标是计算这些成绩的平均值。
解题思路
定义一个名为 average
的函数来计算和返回成绩的平均值。这个函数将接收整个数组作为参数,并通过遍历数组来计算平均成绩。
C 语言实现
#include <stdio.h>
// 函数声明,接受一个浮点数数组和数组的大小
float average(float array[], int n);
int main() {
float scores[10], avg;
int i;
printf("Enter 10 scores:\n");
for (i = 0; i < 10; i++) {
scanf("%f", &scores[i]); // 输入10个成绩
}
avg = average(scores, 10); // 调用average函数
printf("Average score is %.2f\n", avg);
return 0;
}
// 定义average函数
float average(float array[], int n) {
int i;
float sum = 0.0;
for (i = 0; i < n; i++) {
sum += array[i]; // 累加所有成绩
}
return sum / n; // 计算平均成绩并返回
}
程序分析
- 主函数中声明了一个浮点数组
scores
用来存储学生的成绩,并通过循环接收用户输入的成绩。 average
函数接收一个浮点数数组和表示数组大小的整数作为参数。它遍历数组,计算总成绩,然后除以元素数量来求得平均值,并返回这个值。- 形参数组在函数定义时可以不指定数组的大小,这样使得函数更加通用,可以处理不同大小的数组。
结论
通过将数组名作为函数参数,我们可以在函数内部直接访问和修改数组的内容,这提高了程序的效率和灵活性。在这个例子中,我们通过传递数组名和数组大小,使得 average
函数能够适用于任何大小的数组。这种方法也有助于保持代码的整洁和模块化,使得函数更容易理解和维护。