假设需要用一个函数处理结构数组。因为数组的名称等同于它的地址,所以可以把数组名传递给函数。 再一次,函数需要访问结构模板。要说明这如何工作,程序将有关货币的程序扩展到两个人, 以具有一个含有两个fiinds结构的数组。
/* 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",
3024.72,
"Lucky*s Savings and Loan",
9237.11
},
{
"Honest Jack's Bank",
3534.28,
"Party Time Savings",
3203.89
}
};
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 $19000.00.
数组名jones是数组的地址。具体地,它是数组第一个元素,即结构j〇nes[0]的地址。因此,指针money域初是由这个表达式给出的:
money = &jones[0};
因为money指向数组jones的第个元素,所以m〇ney[0】是该数组的第-个元素的另一个名称。同样, moneyn]是第二个元素。每个元素是个funds结构,所以每个元素都可以使用点(.)运算符来访问其结 构成员。
下面这些是要点:
•可以用数组名把数组中第一个结构的地址传递给函数。
•然后可以使用数组的方括号符号来访问数组中的后续结构。注意下面的函数调用和使用数组名有 同样的效果:
sum (& jones[ 0], N)
因为二者都指向同一地址。使用数组名只是传递结构地址的-种间接方法。
•因为函数sum O不用来改变原来的数据,所以我们使用ANSI C的限定词const。