其他结构特性
在现在的C (包括ANSIC)中,结构不仅可以作为参数传递给函数,也可以作为函数返回值返回。把 结构作为函数参数可以将结构信息传递给-个函数,使用函数返回结构可以将结构信息从被调用函数传递给调用函数。同时,结构指针也允许双向通信,因此可以使用任一种方法解决编程问题。我们来看看另一组说明这两种方法的例子。
为了对比这两种方法,我们写一个用指针处理结构的简单程序;然后再用结构传递和结构返回来重写 这个程序。程序本身要求您输入名和姓,然后告诉您姓名中的字母总数。这个程序原本并不需要结构,但是它提供了一个说明其工作原理的简单的框架。
该版本的最终结果和前面的版本相同,但它使用了不同的方法。3个函数中的每一个都创建了自己的 person副本,因此该程序不是只使用了丨个结构,而是使用了 4个不同的结构。/* names2.c --传递和返回结构*/
#include<stdio.h>
#include<string.h>
struct namect{
char fname[20];
char lname[20];
int letters;
};
void getinfo(struct namect *);
void makeinfo(struct namect *);
void showinfo(const struct namect *);
struct namect getinfo1 (void);
struct namect makeinfo1 (struct namect);
void showinfo1( struct namect );
int main(void)
{
struct namect person,person1;
getinfo(&person);
makeinfo(&person);
showinfo(&person);
person1=getinfo1();
person1=makeinfo1(person1);
showinfo1(person1);
return 0;
}
void getinfo(struct namect *pst)
{
printf("Plesae enter your first name.\n");
gets(pst->fname);
printf("Please enter your last name.\n");
gets(pst->lname);
}
void makeinfo(struct namect *pst)
{
pst->letters=strlen(pst->fname)+strlen(pst->lname);
}
void showinfo(const struct namect *pst)
{
printf("%s %s,your name contains %d letters.\n",
pst->fname,pst->lname,pst->letters);
}
//使用结构参数和返回值来完成这个任务
struct namect getinfo1()
{
struct namect temp;
printf("Plesae enter your first name.\n");
gets(temp.fname);
printf("Please enter your last name.\n");
gets(temp.lname);
return temp;
}
struct namect makeinfo1(struct namect info)
{
info.letters=strlen(info.fname)+strlen(info.lname);
return info;
}
void showinfo1( struct namect info)
{
printf("%s %s,your name contains %d letters.\n",
info.fname,info.lname,info.letters);
}
例如,考虑函数makeinfoO。在第一个程序中,传递进来的是person的地址,函数处理的是实际的 person的值。在第二个版本中,创建了一个名为info的新的结构变量。person中存储的值被复制到info中, 函数处理这个副本。因此,在计算字母总数时,将把值存储到info里,而不是person里。然而,返回机制 弥补了这一点。makeinfo ()中的下面这一行:
return info;相结合,将info里存储的值复制到person里。注意,必须把makeinfo ()函数声明为structnamect类型,因为它返回一个结构。
与main ()中的行:
person = makeinfo (person):