结构体的定义1、含义:不同类型数据的集合。2、作用:用于描述一个“概念”。(或记录)如:numnamesexagescoreaddr10010LiFunM1887.5BeiJing定义方法:•一:在定义结构体类型的同时,直接给出结构体变量。–如:struct结构体名–{»结构体成员变量的定义;–}变量名1,变量名2,...,变量名n;二:先给出结构体类型的定义,再定义结构体变量。–如:struct结构体名–{结构体成员变量的定义;例:–};–struct结构体名变量名1,变量名2,...,变量名n;structStudent{intnumber;charname[10];charsex;intage;floatscore;charaddr[30];}st1,st2;structStudent{intnumber;charname[10];charsex;intage;floatscore;charaddr[30];};structstudentst;结构体名(struct):用于标识一种新的数据类型,即结构体类型。注意区分结构体类型与基本数据类型的不同,它是复合数据类型。结构体成员变量与普通变量的定义一样,它还可以是结构体变量。(嵌套)structdate{intmonth,day,year;};structstudent{intnum;charname[20];charsex;intage;structdatebirthday;charaddr[30];}student1,student2;结构体变量的存储#includestdio.hstructstudent{intage;chars[2];}s1;voidmain(){printf(%d,sizeof(student);printf(%d,sizeof(int)+sizeof(char)*2)}structstudent所占存储空间的大小为:各成员变量所占存储单元字节数之和。sizeof(student):structstudent{intnumber;charname[5];charsex;intage;floatscore;charaddr[10];}student1,student2;student1.numberstudent1.name[0]...student1.name[4]student1.sexstudent1.agestudent1.scorestudent1.addr[0]...student1.addr[9]student2.numberstudent2.name[0]...student2.name[4]student2.sex...student1student2结构体类型变量的引用1.结构体变量不能整体输入输出,只能对它的成员进行操作。如:student1.num;2.如果成员本身又是一个结构体类型,则要使用若干个成员运算符,逐级找到最底层的成员。如:student1.birthday.date3.成员变量可以象一般的变量一样进行各种运算,只是在运算时要加上“.”运算符。4.可以引用成员的地址。引用方法:结构体变量名.成员名一。#includestdio.hstructstudent{longnumber;charname[20];charsex;charaddr[30];}a={201410414103,”chenxiaoze”,’M’,”China”};main(){...}二。#includestdio.hstructstudent{longnumber;charname[20];charsex;intage;floatscore;charaddr[30];};main(){structstudenta={201410414103,”chenxiaoze”,’M’,”China”};...}一、含义:若干个相同的结构体类型变量组成的数据集合。二、定义方法:struct结构体名{结构体成员定义;}数组名[元素个数];结构体数组的使用方法1、通过数组的下标(或指向数组的指针)来访问结构体变量。2、再通过结构体变量的成员实现结构体数据的访问。:数组名[下标].成员名:stu[2].name=“WangYing”;structstudent{longnumber;charname[20];charsex;intage;floatscore;charaddr[30];};main(){structstudentstu[3];}structstudent{longnumber;charname[20];charsex;intage;floatscore;charaddr[30];}stu[3];1、含义:在定义结构体数组时完成数组元素的赋值2、方法:与一般数组元素赋初值的方法相同。structstudent{longnumber;charname[20];charsex;intage;floatscore;charaddr[30];}a[3]={{99641,”LiPing”,’M’,56,”TianjinStreet”},{99341,”ZhangFan”,’F’,78,”BeijingRoad”},{99441,”RenZhong”,’M’,34,”ShenyangRoad”}};结构体数组初始化得票统计,设有三个候选人,每次输入一个名字,统计出每个人的得票数.#includestdio.h#includestring.hstructperson{charname[20];intcount;}a[3]={小明,0,小刚,0,小白,0};main(){inti;charleader_name[20];while(1){gets(leader_name);for(i=0;i3;i++)if(strcmp(leader_name,leader[j].name)==0)leader[j].count++;}for(i=0;i3;i++)printf(小明有%d票,小刚有%d票,小白有%d票\n,a[0].count,a[1].count,a[2].count);}}指向结构体变量的起始地址的指针变量.1、必须将指针指向一个确定的结构体变量:p=&a;2、通过结构体变量的指针访问结构体的方法为:a.num、(*p).num、p-num。3、区分两种用法:p-n++和++p-n1、结构体指针的定义:main(){structstudent{longnumber;charname[20];charsex;intage;floatscore;charaddr[30];}a={070441,”LiPing”,’M’,56,”TianjinStreet”},*p=&a;2、结构体指针的使用:a.num,a.name,a.sex,a.addr(*p).num,(*p).name,(*p).sex,(*p).addr;p-num,p-name,p-sex,p-addr;指向结构体数组的指针p++:是指针p指向数组的下个元素,而这个元素是由结构体类型数据组成的,它不是一个简单的变量.(++p)-num:先使指针p指向结构体数组当前位置的下一个元素,再访问其元素成员num;#includestdio.hstructstudent{charname[20];intage;}a[3]={{”小明”,1},{“小刚”,5},{“小白”,3}};main(){structstudent*p;for(p=a;pa+3;p++)printf(“%-20s,%4d\n”,p-name,p-age);}指向结构体的指针作函数的参数1、用结构体变量的成员作函数的参数与一般变量作函数的参数一致;2、用指向结构体变量的指针作函数的参数,实参将地址传递给形参,与指针作函数参数一致;含义:当一个结构体中有一个成员是指向本结构体的指针时,通过这样的指针可以将若干个相同的结构体存储单元连接成一个新的数据结构。链表的结构:structstudent{intnum;floatscore;structstudent*next;};:1、链表中的元素在内存中存放顺序是不连续的。由next指针来连接各节点。2、链表数据结构的实现,必须利用指针变量.headnumscorenextnumscorenextnumscoreNULL...节点在链表中插入结点的过程...headnumscorenextnumscorenextnumscoreNULLnumscorenextstu.nest=st[0].nest;st[0].nest=stu;st[0]st[1]stu删除链表结点的过程:st[2]headnumscorenextnumscorenextnumscorenext...st[0]st[1]st[0].nest=st[2]共同体的含义与定义方法一、含义:几个不同变量共同占用同一块内存空间,只是一种覆盖技术,所谓的共同占用是指这几个变量共同拥有内存的同一个起始地址.共用相同的存储单元。二、定义形式:union共用体名例如:{成员表列;uniondate}变量表列;{inti;charch;floatf;}a,b,c;共同体的存储1.同一块内存可以存放不同类型的数据,但在某一时刻只能存放其中的一种;2.共用体变量中起作用的成员是最后一次存放的成员;3.共用体变量的地址和它的成员的地址是同一个地址;4.共用体变量不能整体被赋值,也不能给共用体变量赋初值;5.不能把共用体变量作为函数的参数进行传递,但可以使用指向共用体变量的指针作为函数的参数;6.结构体类型和共用体类型可以嵌套使用。a.i/a.ch/a.fb.i/b.ch/b.fc.i/c.ch/c.fabc如:uniondate{inti;charch;floatf;}a,b,c;共同体的使用已知字符“0”的ASCII为十六进制的30,下面程序的输出为:union{unsignedcharc;unsignedinti[4];}z;main(){z.i[0]=0x39;z.i[1]=0x36;printf(“%c\n”,z.c);}运行结果:90011011000000000i[1]?...i[2]0011100100000000i[0]c的地址i[0]的低位地址#includestdio.hmain(){unionzj{inta;charch[2];}au;au.a=298;printf(%d\n%d\n,au.ch[0],au.ch[1]);}运行结果为:42,1结构体与共用体一、共同点:都是不同类型数据的集合二、不同点:1、结构体中各个成员均在内存中存在,而共同体中只有一个成员存在于内存中。2、结构体占用的存储空间是所有成员所占空间的和;=sizeof(结构体名)而共用体所占内存空间的大小是所有成员中占用存储空间最大的一个成员的占用空间的值。3、结构体中各个成员相互独立、互不干扰,共同体中改变一个成员的值,会影响到其它成员的值。4、结构体与共同体可以互为成员。枚举类型1、含义:“枚举类型”是将变量的取值一一列举出来,变量的取值只限在列出来的取值范围内.2、定义方法:enumweekday{sun,mon,tue,wed,thu,fri,sat};enumweekdayworkday;枚举类型的变量workday的取值只能在sun--sat之间.typedef定义类型一、含义:使用typedef可以说明一个新的类型标识符。二、定义方法:typedef类型名标识符三、要点:1、“类型名”为已有定义的类型标识符;“标识符”为用户定义的新标识符2、经typedef说明后的标识符可作为原数据类型名使用typedefstructstudent{inti;...}REC;RECx,y,*p;typedefstruct{intmonth;intday;intyear;}DATE;DATEbir