资源描述
Click to edit Master title style,Click to edit Master text styles,Second Level,Third Level,Fourth Level,Fifth Level,*,*,*,11.1,概述,11.2 定义结构体类型变量的方法,11.3 结构体变量的引用,11.4 结构体变量的初始化,11.5 结构体数组,11.6 指向结构体类型数据的指针,11.7 用指针处理链表,11.8 共用体,11.9 枚举类型,11.10 用typedef定义类型,第十一章 结构体与共用体,11.1 概述,数据的基本类型:整、实、字符。,数组是构造类型:每个元素为同一类型,有些问题仅用基本类型和数组来描述是无法实现的,需要将不同类型的数据组合成一个有机的整体。,如学生情况:,num,name,sex,age,score,addr,整,字符串,字符,整,实,字符串,11001,Zhang xin,m,19,96.5,Shang hai,12001,Wang li,f,20,98.5,Bei jing,这些数据类型虽不相同,但它们却是有机的整体,若将它们分别定义,则难以反映它们之间的内在联系。,在C语言中,结构体是用户声明的一种数据类型,一经声明,就可用此类型定义相关的变量。,如上述问题可声明如下数据类型:,struct student,int num;,char name20;,char sex;,int age;,float score;,char addr30;,;,作为类型名,它就和其它基本类型一样,用它来定义变量的类型。,struct是声明结构体类型时所必须使用的关键字,向编译系统声明这是个结构体类型,其中包含若干数据项,这个类型名的全称是:,struct student,声明一个结构体类型的一般形式:,struct 结构体名,成员表列,;,结构体名又称结构体标志。,这是用户自定义的类型,一经声明,就可以和其它基类型一样用来定义此种类型的变量了。,11.2定义结构体类型变量的方法,有三种:,1、先声明结构体类型,再定义变量名,声明 结构体类型不分配存储单元,用该类型定义变量时,分配存储单元。,struct student,int num;,char name20;,char sex;,int age;,float score;,char addr30;,;,则s1,s2这两个结构体变量各占59个字节的存储空间。,struct student s1,s2;,2.在声明类型的同时定义变量,一般形式:,struct 结构体名,成员表列,变量名表列;,例如:,struct student,int num;,char name20;,char sex;,int age;,float score;,char addr30;,s1,s2,s3;,3.直接定义结构体类型变量,一般形式:,struct,成员表列,变量名表列;,例如:,struct,int num;,char name20;,char sex;,int age;,float score;,char addr30;,s1,s2,s3;,s1,s2,s3尽管没有结构名,但每个结构体变量s1,s2,s3都具有如定义的各成员。,4、结构体类型的几点说明,(1)、类型与变量意义不同,变量可以赋值、存取、存储等运算,而类型不能运算,不分配存储空间。,(2)、结构体变量的使用遵循先声明结构体类型,再用该类型定义变量或组数;然后使用这些变量或数组。,(3)、结构体变量中的成员可单独使用,方法如普通变量;,(4)、成员名和程序中的变量名可相同,它们之间互不影响;,(5)、结构体变量中的成员还可以是结构体变量,11.3 结构体变量的引用,结构体变量被定义后方可使用;,1、引用方法:,结构体变量名.成员名,其中:.为成员分量运算符,其优先级为1,如:s1.num;,2、结构体变量不能进行整体输入输出,编译虽无错,但结果有误,如:,scanf(“%d%s”,printf(“%d,%sn”,s1);,3、成员又可以是结构体类型,运算时运算符一级一级找到最低一级成员,运算只能对最低一级成员进行,如:,struct date,int month;int day;int year;,struct student,int num;char name20;,char sex;int age;,struct date birthday;,float score;char addr30;,s1,s2,s3;,s1.num=11002;,s2.birthday.month=8;,s3.birthday.year=1983;,s1.score=s2.score+s3.score;,11.4 结构体变量的初始化,结构体变量可以在定义时指定初始值,main(),struct student,long int num;char name20;,char sex;char addr20;,a=112001,“LiLi”,M,“123 Beijing Road”;,printf(“No.:%ld nname:%snsex:%cnaddress:%sn”,a.num,a.name,a.sex,a.addr);,11.5 结构体数组,结构体数组的定义形式,形式一:struct 结构体类型名,成员表列,;,struct 结构体类型名 数组名表列;,形式二:struct 结构体类型名,成员表列,数组名表列;,形式三:struct,成员表列,数组名表列;,、结构体数组的初始化,如 定义一维数组存放三个学生的有关信息,main(),int i;,struct student,long num;char name20;,char sex;int age;,float score;char add30;,stu3=11200111,“LiLin”,M,18,87.5,“123 Beijing Road”,112002112,“Zhang Fun”,M,19,99,“130 Shang Hai Road”,11200313,“Wang Min”,F,20,78.5,“1010 Zhong Shan Road”;,也可以先定义结构类型,再定义数组时初始化,如:,struct student int num;,struct student stu=,;,11.5.3 结构体数组应用举例,例对侯选人得票的统计程序。统计三个候选人的得票情况,struct person,char name20;int count;,leader3=“li”,0,“zhang”,0,“fun”,0;,main(),int i,j;char leader_name20;,for(i=1;i=10;i+),scanf(“%s”,leader_name);,for(j=0;j3;j+),if(strcmp(leader_name,leaderj.name)=0),leaderj.count+;,for(i=0;inum,p-name,p-sex,p-score);,结构体变量的指针就是该结构体变量所占内存块的起始地址,还可以用指针变量指向结构体内的成员,对结构体成员的操作可归结为:,结构体变量.成员名,(*p).成员名,p-成员名,&(*p).成员名(取结构体成员地址),-:指向运算符,优先级1级,,P-num:得到p指向结构体成员num的值,P-num+:得到p指向结构体成员num,用完后使num值增1,+p-num:得到p指向结构体成员num,使之先增1再使用。,11.6.2 指向结构体数组的指针,结构体数组及其元素可用指针变量来指向 数组首地址赋给指向结构体类型的指针变量时,当指针变量增1时,指向下一个数组元素。,指向结构体数组指针的应用,struct student,long num;char name12;char sex;int age;,struct student stu4=11200121,“LiLin”,m,18,11200222,“zhangFun”,m,19,11200323,“WangMin”,f,20,11200424,“zhaodan”,f,19;,main(),struct student*p;,printf(“No Name sex agen”);,for(p=stu;pnum,p-name,p-sex,p-age);,11.6.3 用结构体变量和指向结构体的指针作函数参数,将一个结构体变量的值传递给另一函数,方法有3种:,(1)、,结构体变量的成员作实参,传递给函数,是单向的值传递,注意形、实的类型要一致。,(2),结构体变量作实参,,将结构体变量所占的内存单元的内容全部顺序传递给形参,要求形参与实参同类型。函数调用是单值传递,且形参占用内存单元,若形参的值被改变,不会返回主调函数。,(3),指向结构体变量的指针作实参,,传递的是结构体变量的地址。,结构体变量stu有学号、姓名和三门课成绩,在main函数中赋值,在print函数中打印输出(用结构体变量作参数)。,#define FORMAT “%ldn%sn%fn%fn%fn”,struct student,long num;char name20;float score3;,main(),void print(struct student);struct student stu;stu.num=112001;,strcpy(stu.name,“LiLi”);stu.score0=67.5;,stu.score1=89;stu.score2=78.6;print(stu);,void print(struct student stu),printf(FORMAT,stu.num,stu.name,stu.score0,stu.score1,stu.score2);,printf(“n”);,结构体变量 stu有学号,姓名和三门课成绩,用指向结构体变量的指针作实参。,#define FORMAT “%ldn%sn%fn%fn%fn”,struct student,long num;char name20;float score3;,stu=112002,”LiLi”,67.5,89,78.6;,main(),void print(struct student *);,print(,void print(struct student *p),printf(FORMAT,p-num,p-name,p-score0,p-score1,p-score2);,printf(“n”);,11.7 用指针处理链表,11.7.1 链表概述,数组:静态分配存储单元,容易造成内存浪费。,链表:是重要的数据结构,它根据需要,动态分配内存单元。,特征:头指针变量,存放链表首地址,链表中每个元素称结点,,其内容:,1、数据部分:可有若干项(整、实、字符、结构体类型等),2、指针变量:下一结点的地址,最后一个结点的地址部分为NULL。,head,1249,1356,1475,1021,A,1356,B,1475,C,1021,D,Null,1249,链表各结点的特点:,1.在内存中可以不连续,访问某结点应找上一结点提供的地址,每一结点有一指针变量存放下一结点的地址。,2.链表的每个结点实际上是一个结构体变量,它有若干成员组成,包括的内容有两部分:,(1)数据部分:整、实、字符、结构体等类型。,(2)指针变量:通常具有指向自身结构体类型的指针变量,此指针变量用来存放下一结点的地址,以便一环扣一环而形成链表。如:,struct student,int num;,float score;,struct student *next;,;,其中:next 是成员名,又是指针类型,它指向struct student数据类型,,89101,89.5,89103,90,891
展开阅读全文