您好,欢迎访问三七文档
第九章结构体与联合体结构体五个学生的平均成绩:floatscore[5];五个学生的基本信息(包括学号、姓名、性别、成绩和出生日期):#####stu[5];结构体:将不同类型的数据组织在一起,形成新的一种数据类型。数组和结构体的比较:数组和结构体都是构造数据类型,但数组各数组元素的数据类型必须是一致的结构体各组成成员(元素)的数据类型往往是不一致的结构体结构体的定义(定义的是类型)定义形式:struct结构体名{结构体成员类型说明;};例:定义了一个学生结构体数据类型(学号、姓名、性别、成绩)structstu{unsignedintnumber;char*name;charsex;floatscore;};说明:1.结构体是一种构造出来的数据类型。2.结构体成员的数目没有限制。3.结构体成员可以是任何数据类型。4.允许出现嵌套。结构体的定义(定义的是类型)structdate{intday;intmonth;intyear;};structstu{unsignedintnumber;char*name;charsex;floatscore;structdatebirthday;};注:在嵌套定义中,内层结构体的定义必须在外层结构体类型的定义之前定义。结构体的定义(定义的是类型)结构体变量的定义同其他变量一样,结构体变量在使用之前也必须先定义。结构体变量定义的形式如下(形式一):1.struct结构体名结构体变量名表;例如:structstud1,d2,*d3,d4[10];普通变量数组指针变量结构体变量定义的形式如下(形式二):2.把结构体的定义和结构体变量的定义合在一起例如:structstu{unsignedintnumber;char*name;charsex;floatscore;structdatebirthday;}d1,d2,*d3,d4[10];如果只进行一次结构体变量的定义,则可以省略结构体名,这样的结构体称为无名结构体。struct{unsignedintnumber;char*name;charsex;floatscore;structdatebirthday;}d1,d2,*d3,d4[10];结构体变量的定义说明:1.区别结构体名、结构体成员名和结构体变量名。2.三个名字可以相同(在三个不同的位置)。3.结构体变量占用的内存空间是各成员变量所占内存空间大小之和。structaddr{charaddr;intx;}addr;结构体变量的定义结构体类型变量的引用结构体类型变量的引用在对结构体变量引用时,一般只能对其成员进行直接操作,而不准许对结构体变量整体直接进行操作。而且只能通引用结构体变量最底层成员的方法来操作结构体变量值。结构体变量成员的引用形式(形式一):结构体变量名.结构体成员名例:d1.numberd1.birthday.dayd4[0].name结构体类型变量的引用普通变量数组元素例:d1.number=50403;strcpy(d1.name,”lisi”);d1.sex=‘m’;d1.score=70.0;d1.birthday.day=26;d1.birthday.month=6;d1.birthday.year=1986;可以将一个结构体变量的整体赋给一个相同类型的结构体变量。d2=d1;结构体类型变量的引用结构体变量成员的引用形式(形式二):结构体指针变量名-结构体成员名(*结构体指针变量名).结构体成员名例:d3-number(*d3).number结构体类型变量的引用指针变量结构体类型变量的初始化例:structstuf1={50403,Tim,'m',86.5,{3,12,1987}};structstu*f2=&f1;structstuf3[5]={{50401,John,'m',86,{3,12,1987}},{50402,Lili,'f',90,{4,11,1987}}};structstu*f4=f3;注意:(1)先定义结构体变量,指针指向的应该是相同类型的结构体变量。(2)指针的运算含义与一般的指针相同(例如加1)#includestdio.hstructstu{intnumber;char*name;floatscore[2];};例:每个学生的信息包括学号、姓名和两门课的成绩,计算学生每门课的总成绩和平均成绩。main(){inti;structstustudents[5]=\{{1001,Wangli,{90,89}},{1002,Zhangyi,{99,89}},\{1003,Gaowei,{85,93}},{1004,Chenjiang,{97,88}},\{1005,Lilin,{82,98}}};floataver1,aver2,sum1=0,sum2=0;for(i=0;i5;i++){sum1=sum1+students[i].score[0];sum2=sum2+students[i].score[1];}aver1=sum1/5;aver2=sum2/5;printf(sum1=%f,sum2=%f\n,sum1,sum2);printf(aver1=%f,aver2=%f\n,aver1,aver2);}structss{intno;char*r;};main(){structsssv[]={{1,Wang},{2,Zhang}};structss*q=sv;printf(%c,++*q-r);printf(%2d,(*q).no);printf(%2d,++q-no);printf(%2d,(++q)-no);printf(%2c\n,*(q++)-r);}例:给出程序的运行结果。P244结构体在函数间的传送用数据复制方式传送结构体变量用地址复制方式传送结构体变量结构体在函数间的传送用数据复制方式传送结构体变量实参:结构体类型表达式,形参:结构体类型变量structcom{floatreal;floatimage;}r;structcomcadd(structcomx,structcomy){r.real=x.real+y.real;r.image=x.image+y.image;return(r);}例:编程求两个复数的和。main(){structcomz1,z2,z;printf(\nentercomplexz1:);scanf(%f,%f,&z1.real,&z1.image);printf(\nentercomplexz2:);scanf(%f,%f,&z2.real,&z2.image);z=cadd(z1,z2);printf(z1+z2=%.2f+%.2fi\n,z.real,z.image);}用地址复制方式传送结构体变量实参:结构体的地址,形参:结构体指针变量结构体在函数间的传送#includestdio.hstructstu{unsignedintnum;char*nam;intsco;};例:输入输出5个学生的信息,每个学生的信息包括学号、姓名和总成绩,要求:输入用input函数实现。input(structstu*st){inti;for(i=0;i5;i++){scanf(%u%s%d,&st-num,st-nam,&st-sco);st++;}}main(){inti;structstustus[5];input(stus);for(i=0;i5;i++)printf(%8u%8s%8d\n,stus[i].num,\stus[i].nam,stus[i].sco);}联合体联合体:是一种构造数据类型,若干成员变量组成一个整体,不同于结构体的是成员变量共用一个起始地址(占相同的存储空间)uniontravel_expense{floatcar_expense:floatboat_expense;floattrain_expense;};联合体定义形式(类型):union联合体名{联合体成员类型说明;};联合体变量定义的形式:union联合体名联合体变量名表;联合体变量引用的形式:联合体变量名.联合体成员名指向联合体变量指针名-联合体成员名uniontravel_expensebeijing_to_hhht;beijing_to_hhht.car_expense=90.00;beijing_to_hhht.train_expense=140.00;联合体变量的定义和引用:注意:由于联合体变量的各个成员共用同一个存储单元,即联合体变量的所有成员具有相同的内存起始地址,因此,在给联合体变量各成员赋值时,只保留最近一次被赋值的成员值。
本文标题:C语结构体与联合体
链接地址:https://www.777doc.com/doc-3080940 .html