27-使用结构数组的函数
14.7.11 使用结构数组的函数
假设一个函数要处理一个结构数组。由于数组名就是该数组的地址,所以可以把它传递给函数。另外,该函数还需访问结构模板。为了理解该函数的工作原理,程序清单14.13把前面的金融程序扩展为两人,所以需要一个内含两个 funds 结构的数组。
程序清单14.13 funds4.c 程序
/* funds4.c -- 把结构数组传递给函数 */
#include <stdio.h>
#define FUNDLEN 50
#define N 2
struct funds {
char bank[FUNDLEN];
double bankfund;
char save[FUNDLEN];
double savefund;
};
double sum(const struct funds money [], int n);
int main(void)
{
struct funds jones[N] = {
{
"Garlic-Melon Bank",
4032.27,
"Lucky's Savings and Loan",
8543.94
},
{
"Honest Jack's Bank",
3620.88,
"Party Time Savings",
3802.91
}
};
printf("The Joneses have a total of $%.2f.\n",sum(jones, N));
return 0;
}
double sum(const struct funds money [], int n)
{
double total;
int i;
for (i = 0, total = 0; i < n; i++)
total += money[i].bankfund + money[i].savefund;
return(total);
}
该程序的输出如下:
The Joneses have a total of $20000.00.
(读者也许认为这个总和有些巧合!)
数组名 jones 是该数组的地址,即该数组首元素( jones[0] )的地址。因此,指针 money 的初始值相当于通过下面的表达式获得:
money = &jones[0];
因为 money 指向 jones 数组的首元素,所以 money[0] 是该数组首元素的另一个名称。与此类似, money[1] 是第2个元素。每个元素都是一个 funds 类型的结构,所以都可以使用点运算符( . )来访问 funds 类型结构的成员。
下面是几个要点。
可以把数组名作为数组中第1个结构的地址传递给函数。
然后可以用数组表示法访问数组中的其他结构。注意下面的函数调用与使用数组名效果相同: sum(&jones[0], N)因为jones和&jones[0]的地址相同,使用数组名是传递结构地址的一种间接的方法。
由于sum()函数不能改变原始数据,所以该函数使用了ANSI C的限定符const。