回忆一下,函数的参数可以向函数传递值。每个值是个数字,可能是int型、float型、ASCII字符编码, 或者是个地址。结构比个单值要复杂些,所以也难怪罕.期的C实现不允许把结构作为参数传递给函数。 较新的C实现取消了这个限制,ANSI C允许把结构作为参数。因此,现在的C实现允许把结构作为参数 传递,或把指向结构的指针作为参数传递。如果只关心结构的一部分,还可以将结构成员作为参数传递给 函数。这2种方法我们都将进行研究,首先看看把结构成员作为参数来传递。
/* fundsl.c —*/
#include<stdio.h>
#define FUNDLEN 50
struct funds{
char bank[FUNDLEN];
double bankfund;
char save[FUNDLEN];
double savefund;
};
double sum1(double,double);//传递结构成员,把结构成员作为参数传递
double sum2(const struct funds*);/* 参数是一个指针 */
double sum3(struct funds moolah);//把结构参数传递
int main(void)
{
struct funds stan={
"Garlic-Melon Bank",
3024.72,
"Lucky's Savings and Loan",
9237.11
};
printf("Stan has a total of $%.2f\n",sum1(stan.bankfund,stan.savefund));//传递结构成员
printf("Stan has a total of $%.2f\n",sum2(&stan));//参数是一个指针
printf("Stan has a total of $%.2f\n",sum3(stan));//参数是一个指针
return 0;
}
/*对两个double数值求和,把结构成员作为参数传递*/
double sum1(double x,double y)
{
return(x+y);
}
//使用结构地址,参数是一个指针
double sum2(const struct funds *money)
{
return (money->bankfund+money->savefund);
}
//把结构参数传递
double sum3(struct funds moolah)
{
return (moolah.bankfund+moolah.savefund);
}
1.传递结构成员
只要结构成员是具有单个值的数据类型(即:int及其相关类型、char、float、double或指针),就可 以把它作为参数传递给一个接受这个特定类型的函数。
函数sum ()既不知道也不关心实际参数是不是结构的成员,它只要求参数是 double类型的。
当然,如果想让被调函数影响调用函数中的成员的值,可以传递成员地址:
modify (&stan.bankfund);
这是一个改变Stan的银行账户的函数。
下一个向函数传递结构信息的方法将使被调函数知道自己正在处理一个结构。
2.使用结构地址
我们还是解决前面那个问题,不过这一次我们把结构的地址作为参数。因为函数要处理fiinds结构, 所以它也要使用funds声明。
这个程序同样产生下面的输出:
Stan has a total of $12261.83.
sum2 ()函数使用一个指向fund结构的指针(money)作为它惟一的参数。把地址&stan传递给该函数 使指针money指向结构stan。然后,使用->运算符来获取stan.bankfund和stan.savefund的值。因为函数没有改变所指向的值的内容,所以它把money声明为一个指向const的指针。
虽然没有这样使用,但是这个函数也可以访问结构的其他成员。注意,必须使用&运算符才能得到结 构的地址。和数组名不一样,单独的结构名不是该结构地址的同义词。
3.把结构作为参数传递
输出仍是这样的:
Stan has a total of $12261.83.
我们用struct funds类型的变量moolah代替了指向struct fiinds变量的指针money。调用sum ()时, 会根据ftinds模板创建一个自动变量moolah。然后,这个结构的成员被初始化为stan结构的相应成员取值 的副本。因此,将使用原有结构的副本完成计算,而前面的程序(使用指针的那个)使用的是原有结构本 身。因为moolah是一个结构,所以程序用的是moolah.bankftind,而不是moolah->bankfund。相反,2中使用了 money->bankfiind,因为money是一个指针,而不是一个结构。