资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,42 结构体,421 结构体的概念,一个数组由类型相同的元素组成,但有些数据类型可能由性质不同的成员组成,这些成员相互关联组成一个整体数据。例如,一个职工的工作证号(number)、姓名(name)、性别(sex)、年龄(age)、部门(department)、工资(wage)等,这些成员都属于某个职工的数据项,如果分别定义成相互独立的变量,则不能体现它们之间的内在联系,而在程序中应该把它们视为同一个数据类型的成员。,第4章 构造型数据类型 之 结构体,第4章 构造型数据类型 之 结构体,利用C语言的结构体类型就可完成这一功能。例如:,struct staff,charnumber8;,charname10;,char sex;,int age;,chardep20;,floatwage2;,;,number 数组,name数组,sex成员,age成员,dep成员,wage成员,struct staff,这样定义的结构体所需的空间是每个成员所需空间之和。这个struct staff共需要,47,个字节,第4章 构造型数据类型 之 结构体,以上定义了一个结构体类型structstaff,它包含了number、name、sex、age、dep、wage等不同类型的数据项。这样就可在程序中使用structstaff类型的变量,把一个职工的相关信息合在一起,组成一个整体来处理。,此时,就可以用struct staff这个类型定义出变量。,第4章 构造型数据类型 之 结构体,例如下面程序段:,structstaffworker;,*定义一个structstaff类型的变量worker*,worker.sexM;,*给worker变量的sex成员赋值M*,strcpy(worker.name,”李大磊”);,*给worker变量的name成员赋值”李大磊”*,printf(“姓名:%s性别:%cn”,worker.name,worker.sex);,*输出worker变量的数据*,第4章 构造型数据类型 之 结构体,42.2 结构体类型及结构体变量,1结构体类型说明的一般形式,struct 结构体名,类型名1 结构体成员名表1;,类型名2 结构体成员名表2;,类型名n 结构体成员名表n;,;,第4章 构造型数据类型 之 结构体,说明:,(1)结构体类型名和结构体变量名由用户命名,命名规则与标识符命名规则相同(即与变量命名规则相同)。,(2)每个“结构体成员名表”都可以含有多个相同类型的成员名,它们之间以逗号隔开。结构体成员的命名规则与变量名的命名规则相同。结构体成员名允许与该结构体外的变量重名,不同结构体中的成员也可以同名,它们代表不同的对象,互不干扰。,(3)结构体成员的类型可以是基本类型、数组、共用体、指针、空类型或已说明过的结构体类型等。,(4),其中,struct,是,C,语言的关键字,是结构体类型的引导字,用于说明结构体类型以及定义结构体变量。,第4章 构造型数据类型 之 结构体,(5),结构体说明的花括号后要以分号“;”结尾。,例如一本书有书号、书名、作者、价格、简介等数据项,可以定义书的结构体类型如下:,struct book_type,int num;,char name60;,char writer30;,float price;,char brief300;,;,这个分号不能少,第4章 构造型数据类型 之 结构体,结构体成员也可以是一个结构体变量,即结构体允许嵌套结构。,例如:下面语句定义了一个有嵌套结构的结构体。,struct date,unsigned char month,;,unsigned char day,;,unsigned year,;,;,struct staff,char number8,;,char name10,;,struct date birthday,;,int age,;,char dep20,;,float wage2,;,;,结构体类型说明只是说明了一个构造型数据类型,系统没有分配任何存储空间。必须定义相应结构体类型的变量,系统才为该变量分配存储空间。类型与变量是不同的概念。,第4章 构造型数据类型 之 结构体,2结构体变量的四种定义方式,(1),紧跟在类型说明之后定义变量、数组,例如:,struct book_type,int num,;,char name60,;,char writer30,;,float price,;,char brief300;,bookl,,,books3,;,此处:在说明结构体类型struct book_type的同时,定义了一个结构体变量bookl与一个结构体数组books,数组books有三个元素:books0、books1、books2。,这种定义变量的一般形式为:,struct结构体名,结构体成员表,变量名表;,第4章 构造型数据类型 之 结构体,(2)先说明结构体类型,再单独进行变量、数组定义,例如:,struct staff,charnumber8;,charname10;,int age;,chardep20;,floatwage2;,;,struct staff worker1,worker2;,此处先说明了结构体类型structstaff,再由另条语句定义变量workerl与worker2为struct staff类型的变量。,第4章 构造型数据类型 之 结构体,(3)说明一个无名结构体类型,直接定义变量、数组 例如:,struct unsigned char month;unsigned char day;unsigned year;workerl,worker2,d15;,以上说明结构体类型时省略了结构体类型名,直接定义结构体数组d1与结构体变量worker1、worker2。若程序中不需要再次定义该结构体类型的变量,可用这种方式一次性定义变量。,第4章 构造型数据类型 之 结构体,(,4),用,typedef,说明一个结构体类型名,再用类型名进行变量定义,(,详见本章,4,5,节,),。,第4章 构造型数据类型 之 结构体,423 结构体变量的使用,结构体是一个构造型数据类型,由此定义的结构体变量的成员,也可以像其他类型的变量一样被赋值,参与表达式运算以及用于输入、输出等操作。,1结构体变量成员的使用,结构体变量成员的表示方式为:,结构体变量名成员名,第4章 构造型数据类型 之 结构体,运算符“”称为结构体成员运算符,它在C语言中的运算优先级的级别是最高的。,可以把“结构体变量名成员名”看成一个整体,,则这个整体的数据类型与结构体中该成员的数据类型相同,可以像使用一个简单变量一样使用“结构体变量 名成员名”。,对于多层嵌套结构体成员的使用,应按照从最外层到最内层的顺序逐层使用成员名,每层成员名之间用结构体成员运算符“”隔开,只能对最内层的成员进行存取、运算以及输入、输出等操作。,第4章 构造型数据类型 之 结构体,例,4,8,学生的数据包括学号、姓名、出生日期、三门课成绩、总分及平均分。定义一个结构变量,其中每个成员都从键盘接收数据,然后计算总分及平均分,最后输出该学生的所有数据。请注意这个例子中不同类型的结构体成员的使用方法。,第4章 构造型数据类型 之 结构体,#include,#define ESC 27,struct student_ type,long int num;*学号*,char name10;*姓名*,struct date_type,int month;,int day;,int year;,birthday;*出生日期*,float score3,total,average;*三门课成绩、总分、平均分*,第4章 构造型数据类型 之 结构体,main(),struct student_type stu;*定义struct student_type类型的结构体变量stu*,do,printf(”请输入学生的学号、姓名、出生年、月、日及三门课学习成绩:n”);,scanf(”1ds”,&stunum,stuname);,*此处name是字符数组首地址,前面不要使用地址运算符“&”*,scanf(“%d%d%d”,&stu,.,birthday,.,year,&stu,.,birthday,.,month,&stu,.,birthday,.,day);,scanf(”fff”,&stuscore0,&stuscore1,&stuscore2);,stutotalstuscore0+stuscore1+stuscore2;,stuaveragestutotal30;,第4章 构造型数据类型 之 结构体,printf(“现输出该学生的数据如下:n”);,printf(“10s10s16s20s10s10sn”,“学号”,”姓名”,”出生日期”,”三门课成绩”,”总成绩”,”平均成绩”);,printf(“10ld10s”,stunum,stuname);,printf(“6d年2d月2d日”,stubirthdayyear,stubirthdaymonth,stubirthdayday);,printf(“82f,62f,62f”,stuscore0,stuscorel,stuscore2);,printf(“82f102fn”,stutotal,stuaverage);,printf(”按Ese退出,按其他键继续n”);,while(getch()!ESC);,/*等待按键,按Ese退出,按其他键继续处理另一位学生的数据。*/,第4章 构造型数据类型 之 结构体,运行结果:,请输入学生的学号、姓名、出生年、月、日及三门课学习成绩:,21003040 田芷 1991 10 29 8750 7600 9050,现输出该学生的数据如下:,,学号 姓名 出生日期 三门课成绩 总成绩 平均成绩,21003040田芷1991年10月29日 8750,7600,90.50 25400 8467,按Esc退出,按其他键继续,第4章 构造型数据类型 之 结构体,2结构体数组成员的使用,结构体数组成员的表示形式为:,结构体数组元素成员名,假设已定义了与例48中相同的struct student_type结构体类型,则可以按如下程序段来定义结构体数组和使用结构体数组成员:,struct student_type student10;,student0birthdayyear1991;*对数组student 0元素的出生年份赋值*,printf(”sn”,student9name);*输出数组student 9元素的姓名*,第4章 构造型数据类型 之 结构体,3相同类型结构体变量之间的整体赋值,新ANSIC标准增加了对结构体类型变量的整体赋值操作。例如:,struct,float f1,f2;,x,y;,xf1=123;,xf2=456789;,y=x;,上述赋值语句,y=x,;相当于两条赋值语句:,y,f1,x,f1,;、,y,f2,x,f2,;,将,x,中每个成员的值都赋给,y,中对应的同名成员。这种赋值方法常用于程序中交换两个结构体变量中所有相对应的成员值。只有类型相同的结构体变量之间才能进行整体赋值。,第4章 构造型数据类型 之 结构体,说明:,(1)表达式sizeof(结构体类型)或sizeof(结构体变量)的值是该结构体各成员所分配的存储空间之和。例如下面程序段(其中struct student_type类型在例48中定义):,struct student_type stu;,printf(“d,dn”,sizeof(struct,student_type),sizeof(stu);,以上程序段运行后输出:40,40。其中成员num占用4个字节,name占用10个字节,birthday占用6个字节,数组成员score占用1
展开阅读全文