第7章结构体7.1概述•数组中的各元素具有相同的数据类型。•在实际应用时,有时需要将不同类型的数据组合成一个有机的整体,便于进行程序设计。•结构体属于构造类型,其各元素的数据类型既可相同,亦可不同。结构体中的各元素亦称为数据项或域。7.2定义结构体变量的方法所有的自定义类型变量的定义均有三种方法:•先定义类型,后定义变量;•类型和变量同时定义;•直接定义变量7.2.1先定义类型,后定义变量;格式:(1)先定义类型struct结构体名{类型标识符1:域标识符1;类型标识符2:域标识符2;……类型标识符n:域标识符n;};(2)在使用结构体变量之前的适当位置,定义变量struct结构体名变量名表;注意:1.此处struct不能省,只有“结构体名变量名表;”是错误的。2.紧接在定义的右花括号后的分号是不能省略的,因为一个结构体定义就是一条语句。例7-1main(){structdate{intyear,month,day;};/*右括号后不能缺少分号*/structdatetoday;scanf(%d%d%d,&today.year,&today.month,&today.day);printf(%d年%d月%d日\n,today.year,today.month,today.day);}7.2.2类型和变量同时定义格式:struct结构体名{类型标识符1:域标识符1;类型标识符2:域标识符2;……类型标识符n:域标识符n;}变量名表;例如,可以用下面的方法定义一个日期变量workday。structdate{intyear,month,day;}workday;7.2.3直接定义变量格式:struct{类型标识符1:域标识符1;类型标识符2:域标识符2;…类型标识符n:域标识符n;}变量名表;说明:直接定义变量只适合于该结构体类型只出现一次。7.3结构体变量的引用7.3.1结构体变量的引用结构体变量名.域名例7-2:定义一个结构体变量t,从键盘上输入3个域的值,并在屏幕上输出。main(){staticstruct{intm,d,y;}t;scanf(%d,%d,%d,&t.m,&t.d,&t.y);printf(%d,%d,%d\n,t.m,t.d,t.y);}7.3.2结构体变量的初始化可以在定义结构体变量的同时,对结构体变量进行初始化。例如:structxyz{inta;charc;}d1={1,'a'};structdated2={2,'b'};例7-3:main(){inti;staticstruct{charno[9];/*学号*/charkc[16];/*课程*/intcj;/*成绩*/}cjb1={20051508,ENGLISH,85};printf(\n学号:%s\n,cjb1.no);printf(课程:%s\n,cjb1.kc);printf(成绩:%d\n,cjb1.cj);}7.3.3同类型结构体变量间的赋值格式是:结构体变量1=结构体变量2;例7-4:定义两个同属于类型structdate的变量d1和d2,先对变量d1赋值,再将d1赋给变量d2。structdate{intmm,dd,yy;};main(){structdated1,d2;d1.mm=9;d1.dd=1;d1.yy=2004;d2=d1;printf(%d-%d-%d\n,d2.mm,d2.dd,d2.yy);}语句d2=d1;等价于执行下列3条语句:d2.mm=d1.mm;d2.dd=d1.dd;d2.yy=d1.yy;7.4结构体数组•在实际应用中,可以把结构体定义为数组,数组的元素类型是结构体类型。例如:typedefstructstudent{charno[10];charname[8];charsex[2];structdatebirthday;intscore;}STUD;STUDs[50];这样可以存放50个学生的课情况。7.5结构体应用实例•例7-5:用结构描述学生成绩,并处理一个学生和数据。•例7-6:输入某个日期,输出第二天的日期。•例7-7:建立学生选课表。本章小结①结构体是一种自定义类型,它不像char,int等是系统定义的标准类型。用户在使用自定义类型前必须先定义,后使用。②结构体类型是把不同类型的数据项放在一个变量中作为整体来处理,其中的数据项称为域。域也可以是一个结构体类型。③一个结构体数据所占用的字节数是它所有域所占字节数之和。④结构体类型可以嵌套定义,即结构体中的域可以是结构体类型。域的引用形式如:结构体变量名。域名。子域名