C primer 读书笔记 结构1

在现在的C中,结构不仅可以做为参数传递给函数,也可以作为函数返回值返回。把结构作为函数参数可以将结构信息传递给函数,使用函数返回可以将结构信息从被调用函数传递给调用函数,同时结构指针也可以双向通信。

例子:指针处理结构

#include<stdio.h>
#include <string.h>

struct name {

 char fname[20];
 char lname[20];
 int letters;
};

 
void getinfo(struct name *);
void makeiinfo(struct name *);
void showinfo(const struct name *);

int main(void){
 struct name person;
 getinfo(&person);
 makeinfo(&person);
 showinfo(&person);
 return 0;
}

void getinfo(struct name *pst){
 printf("plesas enter your first name");
 gets(pst->fname);
 printf("plesas enter your last name");
 gets(pst->lname);
}

void makeinfo(struct name *pst ){
pst->letters = strlen(pst->fname)+strlen(pst->lname);
}

void showinfo(const struct name *pst){
printf("%s %s ,you name contains %d letters \n",pst->fname,pst->lname,pst->letters);

} 


 

 

person 结构的地址传递给了每个函数。

getinfo 函数把信息从它自身传递给了main,具体地,它从用户处获取姓名,通过使用指针pst定位把姓名放入到person结构中。
虽然getinfo 函数给主程序提供了信息,但是它并没用使用返回机制,因此它是void 类型的。

函数makeinfo 执行信息是双向传送。它通过一个指向person的指针来确定结构中存储的姓和名的位置。它使用strlen 来计算姓和名的字母总数。
然后使用person 的地址存储这个总数。它的类型也是void 型。

最后showinfo 函数使用一个指针定位打印的信息。因为这个函数不改变数组的内容,所以它把指针声明为const.

在所有的操作中,只有一个结构变量person,每个函数使用该结构的地址访问它。其中一个函数将信息从函数自身传递给调用程序,一个函数将
信息从调用程序传递给函数自身,一个函数两个工作都做。

 

现在看看如何使用结构参数和返回值来完成这个任务。
第一为了使用结构本身,需要使用person 而不是&person,这样相应的形式参数应该声明为struct name类型,而不是声明为指向该类型的指针。
第二要把结构的值提供给main函数,可以返回一个结构。
前一个版本中,传递进来的是 person 的地址,函数处理的是实际的person 值 。在第二个版本中创建了一个名为info的新的结构变量
person 中存储的值被复制至info中,函数处理这个副本。因此在计算字母总数时,将把值存储至info里,而不是person里。然后,
返回机制弥补了这一点。

 

 

#include<stdio.h>
#include <string.h>

struct name {

 char fname[20];
 char lname[20];
 int letters;
};


 
struct name getinfo(void);
struct name makeinfo(struct name );
void showinfo(const struct name );

int main(void){
 struct name person;
 person = getinfo();
 person = makeinfo(person);
 showinfo(person);
 return 0;
}

struct name getinfo(void){
 struct name temp;
 printf("plesas enter your first name");
 gets(temp.fname);
 printf("plesas enter your last name");
 gets(temp.lname);
 return temp;
}

struct name makeinfo(struct name info ){
 info.letters = strlen(info.fname)+strlen(info.lname);
 return info;

}

void showinfo(const struct name info){
printf("%s %s ,you name contains %d letters \n",info.fname,info.lname,info.letters);

} 


 


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值