C Primer Plus学习 四十七 向函数传递结构信息 (二)

其他结构特性

         在现在的C (包括ANSIC)中,结构不仅可以作为参数传递给函数,也可以作为函数返回值返回。把 结构作为函数参数可以将结构信息传递给-个函数,使用函数返回结构可以将结构信息从被调用函数传递给调用函数。同时,结构指针也允许双向通信,因此可以使用任一种方法解决编程问题。我们来看看另一组说明这两种方法的例子。
         为了对比这两种方法,我们写一个用指针处理结构的简单程序;然后再用结构传递和结构返回来重写 这个程序。程序本身要求您输入名和姓,然后告诉您姓名中的字母总数。这个程序原本并不需要结构,但是它提供了一个说明其工作原理的简单的框架。

/* 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);

}

        该版本的最终结果和前面的版本相同,但它使用了不同的方法。3个函数中的每一个都创建了自己的 person副本,因此该程序不是只使用了丨个结构,而是使用了 4个不同的结构。
例如,考虑函数makeinfoO。在第一个程序中,传递进来的是person的地址,函数处理的是实际的 person的值。在第二个版本中,创建了一个名为info的新的结构变量。person中存储的值被复制到info中, 函数处理这个副本。因此,在计算字母总数时,将把值存储到info里,而不是person里。然而,返回机制 弥补了这一点。makeinfo ()中的下面这一行:
return info;
与main ()中的行:
person = makeinfo (person):
        相结合,将info里存储的值复制到person里。注意,必须把makeinfo ()函数声明为structnamect类型,因为它返回一个结构。









  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值