第9章结构体与共用体9.1结构体概述结构体是一种构造数据类型用途:把不同类型的数据组合成一个整体-------自定义数据类型结 构体类型定义struct[结构体名]{类型标识符成员名;类型标识符成员名 ;…………….};成员类型可以是基本型或构造型struct是关键字,不能省略合法标识符可省:无名 结构体例structstudent{intnum; charname[20];charsex;in tage;floatscore;charaddr[3 0];};namenumsexagescoreaddr2字节2字节20字节1字节4字节 30字节……..结构体类型定义描述结构的组织形式,不分配内存结构体类型定义的作用域例structstud ent{intnum;charname[20]; charsex;intage; floatscore;charaddr[30];}; structstudentstu1,stu2;9.2定义结构体变量的方法先定义结 构体类型,再定义结构体变量一般形式:struct结构体名{类型标识符成员名; 类型标识符成员名;…………….};struct结构体名变量名表列;例#define STUDENTstructstudentSTUDENT{int num;charname[20];charsex; intage;floatscore; charaddr[30];};STUDENTstu1,stu2; 定义结构体类型的同时定义结构体变量一般形式:struct结构体名{ 类型标识符成员名;类型标识符成员名;…………….}变量名表列;例st ructstudent{intnum;charna me[20];charsex;intage; floatscore;charaddr[30]; }stu1,stu2;直接定义结构体变量一般形式:struct{类型标识符成员名; 类型标识符成员名;…………….}变量名表列;例struct{ intnum;charname[20];char sex;intage;floatscore; charaddr[30];}stu1,stu2;用无名结构体直接定义变量只能 一次说明结构体类型与结构体变量概念不同类型:不分配内存;变量:分配内存类型:不 能赋值、存取、运算;变量:可以结构体可嵌套结构体成员名与程序中变量名可相同,不会混淆结构体类型及变量的作用域与生存 期例structdate{intmonth;intday; intyear;};structstudent{intnum;char name[20];structdatebirthday;}stu;numnamebirthd aymonthdayyear例structstudent{intnum;charn ame[20];structdate{intmonth;i ntday;intyear;}birthday;}stu;numnameb irthdaymonthdayyear9.3结构体变量的引用引用规则结构体变量不能整体引用,只能引用变量成员可 以将一个结构体变量赋值给另一个结构体变量结构体嵌套时逐级引用成员(分量)运算符优先级:1结合性:从左向右引用方式: 结构体变量名.成员名例structstudent{intnum; charname[20];charsex; intage;floatscore;cha raddr[30];}stu1,stu2;stu1.num=10;stu1.score=85.5;st u1.score+=stu2.score;stu1.age++;main(){structstu{ intnum;charname;charsex;floatscore; }boy1,boy2;boy1.num=102;boy1.name="Zhangping"; printf("inputsexandscore\n");scanf("%c%f",&boy1.sex,& boy1.score);boy2=boy1;printf("Number=%d\nName=%s\n",boy 2.num,boy2.name);printf("Sex=%c\nScore=%f\n",boy2.sex,boy2.s core);}例structstudent{intnum; charname[20];charsex; intage;floatscore;char addr[30];}stu1,stu2;printf(“%d,%s,%c,%d,%f,%s\n”,stu1) ;(?)stu1={101,“WanLin”,‘M’,19,87.5,“DaLian”};(?)例s tructstudent{intnum;charn ame[20];charsex;intage; floatscore;charaddr[30]; }stu1,stu2;stu2=stu1;()例structstudent{in tnum;charname[20];structdate{int month;intday;intyear;}birthda y;}stu1,stu2;numnamebirthdaymonthdayyearstu1.birthday.m onth=12;例structstudent{intnum; charname[20];charsex; intage;floatscore;chara ddr[30];}stu1,stu2;if(stu1==stu2)……..(?)9. 4结构体变量的初始化形式一:struct结构体名{类型标识符成员名;类型标识 符成员名;…………….};struct结构体名结构体变量={初始数据};例str uctstudent{intnum;charname [20];charsex;intage; charaddr[30];};structstudentstu1={112, “WangLin”,‘M’,19,“200BeijingRoad”};形式二:struct结构体名{ 类型标识符成员名;类型标识符成员名;…………….}结构体变量={初始数 据};例structstudent{intnum; charname[20];charsex;int age;charaddr[30];}stu1={112,“WangLi n”,‘M’,19,“200BeijingRoad”};形式三:struct{类型标识符成员名 ;类型标识符成员名;…………….}结构体变量={初始数据};例struct {intnum;charname[20]; charsex;intage;ch araddr[30];}stu1={112,“WangLin”,‘M’,19,“200BeijingR oad”};9.5结构体数组9.5.1结构体数组的定义三种形式:形式一:structstudent {intnum;charname[20];chars ex;intage;};structstudentstu[2];形式二: structstudent{intnum;charname[2 0];charsex;intage;}stu[2];形 式三:struct{intnum;charname[20]; charsex;intage;}stu[2];numna mesexagenumnamesexagestu[0]stu[1]25B9.5.2结构体数组初始化例st ruct{intnum;charname[20]; charsex;intage;}stu[]={{……},{……},{……} };顺序初始化:structstudent{intnum;cha rname[20];charsex;intage;}; structstudentstu[]={100,“WangLin”,‘M’,20, 101,“LiGang”,‘M’,19, 110,“LiuYan”,‘F’,19};例structstudent {intnum;charname[20];chars ex;intage;}stu[]={{……},{……},{……}};分行初始化: structstudent{intnum;charname[20] ;charsex;intage;};structs tudentstu[]={{100,“WangLin”,‘M’,20}, {101,“LiGang”,‘M’,19}, {110,“LiuYan”,‘F’,19}};全部初始化时维数可省结构体数组引用引用方式: 结构体数组名[下标].成员名structstudent{intnum; charname[20];charsex;intage; }str[3];stu[1].age++;strcpy(stu[0].name,”ZhaoDa”);9.5.3应用举例 统计后选人选票structperson{charname[20];intcount;}leade r[3]={“Li”,0,“Zhang”,0,”Wang“,0};main(){inti,j;charl eader_name[20];for(i=1;i<=10;i++){scanf("%s",leader_ name);for(j=0;j<3;j++) if(strcmp(leader_name,leader[j] .name)==0) leader[j].count++;}for(i=0;i<3;i++) printf("%5s:%d\n",leader[i].name,leader[i].count);}namec ountLiZhangWang000共用体有时需要使几种不同类型的变量存放到同一段内存单元中。unio n共用体名/定义共用体类型/{成员表列};例:uniondata {inti;charch;};定义类型之后,即可定义变 量。uniondataa;引用:a.i,a.ch共用体数据特点(1)每一时刻只有一个成员起作用 ,起作用的是最近存放的成员。(2)共用体变量与成员地址相同。(3)不能对共用体变量赋值、初始化,也不能作函参、函数返回值,但可以使用指针来完成。(4)共用体、结构体类型可相互嵌套。与结构体区别结构体变量各成员同时存在,顺序存放,其长度为各成员长度之和。共用体变量各成员同一时刻只有一个成员存在,其长度取决于最长成员的长度。枚举类型如果一个变量只取有限个数的值,则可定义为枚举类型。变量的值只限于列举出来的值的范围内。例:enumcolor{red,yellow,blue};/enumcolor类型/enumcolori;/i为枚举型变量,取值是三者之一/typedef用typedef声明别名来代替已有类型名。例:typedefintINT;/用INT代表int型/inti,j;等价于INTi,j;(1)习惯上把用typedef声明的类型名用大写字母表示,以便与已有类型区别。(2)typedef只是对已有类型声明一个类型名,而没有创造新类型。(3)与#define区别在于是在编译时处理。(4)使用typedef利于程序通用与移植。 |
|