您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > C语言中-结构体和联合体使用
第十章结构体与联合体结构体的定义、声明、初始化结构体成员的访问结构体变量的复制与比较结构体与数组、函数联合体概述问题:一个变量可以表示一种数据类型的数据项。一个数组可以表示一组相同类型的数据项。如何表示一组不同类型的数据项呢?例如:如果我们需要保存以下信息作为一个信息整体:一个大小为20的字符数组一个整形数字一个浮点型数字概述为满足以上应用需求,提出结构体的概念结构体是一种机制能够封装不同类型的数据用于处理一组逻辑相关的数据项以一种有意义的方法来组织复杂的数据联合体是一种特殊的结构体为节省存储空间而存在几乎没有什么应用机会结构体的定义我们可以定义以下格式的结构体structman{charjob[20];intold;floatheight;};该结构体有3个数据字段,称为结构体成员每个成员可以属于不同的数据类型man是结构体的名字,称为结构体标记符定义结构体以后,可以使用标记符来声明属于该结构体的变量结构体的定义结构体定义的格式如下:struct结构体标记符{数据类型成员变量1;数据类型成员变量2;……};注意:结构体一般以分号结尾整个结构体是一条语句每个成员都有自己的名称和数据类型结构体标记符可以在随后的程序中声明结构体变量声明结构体变量定义了结构体,就可以声明这种类型的变量结构体变量的声明格式struct结构体标记符变量名1,变量名2;例:structmanLiangYe;结构体成员本身不是变量,定义结构体时不会它们分配存储空间当声明结构体变量时,将为结构体变量分配存储空间。声明结构体变量可以将结构体的定义与变量的声明结合在一起,例如:structman{charjob[20];intold;floatheight;}LiangYe;此时,结构体的名字可以省略,例如:struct{charjob[20];intold;floatheight;}LiangYe;访问结构体成员LiangYe是一个结构体变量,它有多个成员,如何引用,如何赋值呢?在结构体中,变量与成员之间的关系使用成员运算符‘.’来建立。如:LiangYe.oldLiangYe.height对变量的成员赋值,可以使用LiangYe.old=29;LiangYe.height=1.80;访问结构体成员例:定义一个结构体,保存从键盘输入每个人的信息(姓名、参加工作时间、工资),保存在结构体中,然后输出。structpersonal{charname[20];intday;intmonth;intyear;floatsalary;}main()访问结构体成员{structpersonalperson;scanf(“%s%d%d%d%f”,person.name,&person.day,&person.month,&person.year,&person.salary);printf(“%s%d%d%d%f\n”,person.name,person.day,person.month,person.year,person.salary);}结构体的初始化结构体变量可以在编译时初始化例:main(){struct{intweight;floatheight;}student={75,1.80};}成员与初始化值必须一一对应不允许在声明时初始化结构体的初始化初始化多个结构体变量例:main(){structman{intweight;floatheight;};structmanstudent1={75,1.80};structmanstudent2={75,1.80};}结构体的初始化初始化工作也可以在主函数外面进行例:structman{intweight;floatheight;}student1={75,1.80};main(){structmanstudent2={75,1.80};}结构体变量的复制与比较结构体变量可以使用‘=’进行复制例如:student1=student2;结构体变量不可以使用逻辑运算符进行操作以下操作是错误的:student1!=student2;student1==student2;结构体的比较必须使用逐个成员分别比较的方法单个成员的运算结构体成员的运算与结构体成员的访问方法一样例如:LiangYe.old+=1;LiangYe.old++;结构数组我们使用以下结构体来表示一个人的属性structman{intold;floatheight;};如果要表示多个人呢?我们可以声明一个结构体数组,例如:structmanstudent[23];结构数组程序structman{intold;floatheight;};main(){structmanstudent[2]={{18,45},{19,48}}}结构数组举例structmarks{intsub1;intsub2;intsub3;inttotal;};main(){inti;structmarksstudent[3]={{67,78,89,0},{76,87,98,0},{84,72,94,0}}structmarkstatal;……}结构数组举例for(i=0;i=2;i++){student[i].total=student[i].sub1+student[i].sub2+student[i].sub3;total.sub1+=student[i].sub1;total.sub2+=student[i].sub2;total.sub3+=student[i].sub3;total.total+=student[i].total;}结构体中的数组数组可以作为结构体的成员structmarks{intsub[3];inttotal;}student[2];可以使用student[1].sub[2];来表示第2个学生的第3科得分。结构体中的数组举例structmarks{intsub[3];inttotal;};main(){inti,j;structmarksstudent[3]={{67,78,89,0},{76,87,98,0},{84,72,94,0}}structmarkstatal;……}for(i=0;i=2;i++){for(j=0;j=2;j++){student[i].total+=student[i].sub[j];total.sub[j]+=student[i].sub[j];}total.total+=student[i].total;}结构体中的结构体结构体可以嵌套,如我们声明一个结构体:structsalary{charname[20];chardepartment[50];intbasic_pay;inthouse_rent_allowance;intcity_allowance;}employee;结构体中的结构体我们可以重新声明一个嵌套的结构体:structsalary{charname[20];chardepartment[50];intbasic_pay;struct{inthouse_rent;intcity;}allowance;}employee;结构体中的结构体嵌套结构体的成员引用方法employee.allowance.house_rentemployee.allowance.city非法引用employee.allowanceemployee.city结构体中的结构体可以使用标记符来定义内部结构体变量structpay{inthouse_rent;intcity;};structsalary{charname[20];chardepartment[50];structpayallowance;};structsalaryemployee[100];结构体与函数C语言的精髓是函数的使用把结构体的值从一个函数传递给另一个函数的方法有:把结构体的每个成员作为函数的实参进行传递将结构体的副本传递给被调用函数使用指针以参数形式来传递结构体方法2是最常用的方法之一调用形式为:函数名(结构体变量);被调用形式为:返回值类型函数名(结构体类型结构体变量名);结构体与函数如果被调用函数的返回值是一个结构体,则对被调用函数声明时,其返回值类型应为struct+结构体标记符。做实参的结构体变量与形参必须为相同的结构体类型。当返回值为结构体时,必须将它赋值给相同类型的结构体。结构体与函数举例structstores{charname[20];floatprice;intquantity;};structstoresupdate(structstoresproduct,floatp,intq){product.price+=p;product.quantity+=q;returnproduct;}结构体与函数举例main(){floatp_increment,value;intq_increment;structstoresitem={“pen”,3.5,10};scanf(“%f%d”,&p_increment,&q_increment);item=update(item,p_increment,q_increment);value=item.p_increment*p_increment.q_increment;printf(“%f”,item.price);printf(“%d”,item.quantity);printf(“%f”,value);}联合体联合体是一种特殊形式的结构体,因此遵循与结构体相似的语法。联合体的定义格式:unionitem{intm;floatx;charc;}code;联合体联合体与结构体的区别是存储形式在结构体中,每个成员都有自己的存储空间在联合体中,所有成员使用相同的存储空间因此,联合体一次只能存储一个成员。联合体存储空间的大小,由占用空间最大的成员类型决定。在联合体中,当某个成员被赋予一个新值后,该值将替代掉前一个成员的值。例如以下将产生错误的输出:code.m=279;code.x=2344.56;printf(“%d”,code.m);因此,联合体初始化时,只能对第一个成员进行初始化,例如:unionitemabc={100};而以下声明是非法的:unionitemabc={10.03};结构体的大小使用一元运算符sizeof可以计算数据类型或者变量的大小。结构体也适用。例如:sizeof(structx);structxy;sizeof(y);structxz[100];intsizeofarray=sizeof(z)/sizeof(structx);
本文标题:C语言中-结构体和联合体使用
链接地址:https://www.777doc.com/doc-3984328 .html