结构体、联合体与枚举类型.ppt

上传人:小飞机 文档编号:6015424 上传时间:2023-09-14 格式:PPT 页数:61 大小:204KB
返回 下载 相关 举报
结构体、联合体与枚举类型.ppt_第1页
第1页 / 共61页
结构体、联合体与枚举类型.ppt_第2页
第2页 / 共61页
结构体、联合体与枚举类型.ppt_第3页
第3页 / 共61页
结构体、联合体与枚举类型.ppt_第4页
第4页 / 共61页
结构体、联合体与枚举类型.ppt_第5页
第5页 / 共61页
点击查看更多>>
资源描述

《结构体、联合体与枚举类型.ppt》由会员分享,可在线阅读,更多相关《结构体、联合体与枚举类型.ppt(61页珍藏版)》请在三一办公上搜索。

1、第11章结构体、联合体与枚举类型,结构体类型是C语言允许用户定义的又一重要的构造数据类型。,11.1 结构体的概念11.2 结构体数组11.3 结构体指针11.4 链 表11.5 联合体数据类型11.6 枚举数据类型11.7 自定义类型,11.1 结构体的概念 结构体类型是一种构造数据类型,是数目固定,类型不同的若干有序数据项的集合。每个数据项称为一个成员。每一个成员可以是一个基本数据类型或者是一个构造类型。结构体数据类型具有很强的数据描述能力,但C语言中并不提供现成的结构体类型。因此,用户在使用一个结构体类型之前,必须先定义它,也就是要在程序中构造所需要的数据类型。,11.1.1 结构体类型

2、的定义结构体类型定义的一般形式为:struct 结构体类型名 类型标识符 成员名1;类型标识符 成员名2;类型标识符 成员名n;;,例如,定义一个“学生信息”的结构体类型如下:struct student int num;char name10;char sex;int age;char addr50;int score;,11.1.2 结构体变量的定义、引用、初始化1结构体变量的定义(1)先定义结构体类型,再定义结构体类型变量。这种定义的一般形式为:struct 结构体类型名 结构体变量名表;如上面定义了“学生信息”的结构体类型struct student后,就可以用它来定义结构体变量。,例

3、如:struct student stul,stu2;定义了stul和stu2为struct student类型的变量,编译系统为变量 stul与stu2分配存储空间时,其存储格式与结构体类型struct student所描述的保持一致,结构体中的各个成员按要求顺序存放。每一个struct student类型的变量占用的存储单元为67个字节。,(2)在定义结构体类型的同时定义结构体变量。这种定义的一般形式为:struct 结构体类型名 类型标识符 成员名1;类型标识符 成员名2;类型标识符 成员名n;结构体变量名表;,例如:struct student int num;char name10;

4、char sex;int age;char addr50;int score;stu1,stu2;这种定义与前面的定义功能相同,都是既定义了结构体类型struct student,又定义了两个结构体变量stu1与stu2。,(3)直接定义结构体类型的变量。其一般形式为:struct 类型标识符 成员名1;类型标识符 成员名2;类型标识符 成员名n;结构体变量名表;,例如:struct int num;char name10;char sex;int age;char addr50;int score;stu1,stu2;,2结构体变量的引用结构体成员引用的一般形式如下:结构变量名.成员名 其中

5、“.”为结构体成员运算符,所有C语言运算符中它的优先级最高,因此可以把上述引用形式作为一个整体来看待。例如,stu1.name、stu2.score分别表示结构体变量stu1的成员name与结构体变量stu2的成员score。,例11.1 定义有关职工工资信息的结构体类型变量(包括编号、姓名、基本工资、附加工资、水电费、实发工资),为结构体变量中的成员赋值并输出其值。struct person int num;/*职工编号*/char*name;/*姓名*/float base;/*基本工资*/float addition;/*附加工资*/float cost;/*水电费*/float sal

6、ary;/*实发工资*/;main()struct person employeea,employeeb;employeea.num=2086;employeea.name=Zhao xiwang;,printf(input base,addition,cost:n);scanf(f,f,f,程序运行结果为:input base,addition,cost:805.85,376.57,123.52Number=2086Name=Zhao xiwangBase=805.85Addition=376.57Cost=123.52Salary=1085.90,3结构体变量的初始化 结构体变量的初始化和

7、对数组的初始化相类似。将各个成员的初值用一对花括弧括起来,括弧内各数据项的数据类型、顺序要和结构体类型说明中的成员类型相匹配,数据项间用逗号分隔。如果初值的个数少于结构中成员的个数,则余下的成员将自动初始化为0或NULL。例如:struct student int num;char name10;char sex;int age;char addr50;int score;,main()struct student stu=1422,Lin Hui,M,18,Shang Hai,85;printf(Number=dnName=snSex=cn,stu.num,stu.name,stu.sex)

8、;printf(Age=dnAddress=snScore=dn,stu.age,stu.addr,stu.score);,程序运行结果为:Number=1422Name=Lin HuiSex=MAge=18Address=Shang HaiScore=85,11.1.3 结构体的嵌套 结构体类型定义时,其成员的类型也可以是结构体类型,即结构体类型定义是可以嵌套的。结构体定义的嵌套可以是多重的。,例如,定义一个“职工信息”的结构体类型。每个职工包含编号(num)、姓名(name)、性别(sex)、出生日期(birthday)、家庭住址(addr)等信息。其中出生日期包括年(year)、月(mo

9、nth)、日(day)3个数据项,家庭住址包括城市(city)、街道(street)、门牌号码(streetnum)等信息。职工信息的逻辑结构如图11.3所示。,图11.3 职工信息逻辑结构,显然“职工信息”中的“出生日期”和“家庭住址”应该用结构体类型描述,首先定义结构体类型“日期”struct date和“住址”struct address如下。struct date int year;/*年*/int month;/*月*/int day;/*日*/;struct address char city50;/*城市*/char street50;/*街道*/int streetnum;/*

10、门牌号码*/;,然后定义结构体类型“职工”struct employee如下。struct employee int num;char name10;char sex;struct date birthday;struct address addr;,在结构体类型struct employee中,成员birthday是struct date结构体类型,它又有自己的成员year、month、day,成员addr是 struct address结构体类型,它又有自己的成员city、street、streetnum,这就是结构体类型的嵌套定义。对于嵌套的结构体,引用时应按照从左到右,从外到内的方式,

11、用“”一级一级地运算,直到找到最低一级的成员。,例如:struct employee emp;emp.num=1001;strcpy(emp.name,Liu Xiaomei);emp.sex=F;emp.birthday.year=1986;emp.birthday.month=5;emp.birthday.day=18;strcpy(emp.addr.city,Bei Jing);strcpy(emp.addr.street,Changan street);emp.addr.streetnum=168;,定义了struct employee类型的变量emp,对其各个成员赋值。赋值后结构体变

12、量emp在内存中的存储形式如图11.4所示。,图11.4 结构体变量emp,11.2 结构体数组,11.2.1 结构体数组的定义,结构体数组的定义方法与其他整型数组、实型数组和字符型数组的定义方法类似。例如:struct student int num;char name10;char sex;int age;char addr50;int score;;struct student stu40;,与结构体变量的定义类似,结构体数组的定义也可以采用以下的方式:struct student int num;char name10;char sex;int age;char addr50;int

13、score;stu40;,或struct int num;char name10;char sex;int age;char addr50;int score;stu40;,11.2.2 结构体数组的引用例11.3 输入全班的学生的信息(包括学号、姓名、性别、年龄、成绩和家庭住址),并按成绩由高到低的次序排序,输出排序后的全班学生信息登记表。struct student int num;char name10;char sex;int age;char addr50;int score;;,main()struct student stu40,temp;int i,j,k;for(i=0;i4

14、0;i+)printf(n学号:);scanf(d,for(i=0;i39;i+)k=i;for(j=i+1;j40;j+)if(stuk.scorestuj.score)k=j;temp=stui;stui=stuk;stuk=temp;printf(n学号t姓名t性别t年龄t家庭住址t成绩n);for(i=0;i40;i+)printf(dtstct,stui.num,stui.name,stui.sex);printf(dtsttdn,stui.age,stui.addr,stui.score);,11.2.3 结构体数组的初始化,struct student int num;char

15、name10;char sex;int age;char addr50;int score;;struct student stu5=6001,Zhao zhen,F,18,Beijing,85,6002,Lin ping,F,19,Shanghai,70,6003,He fang,F,18,Qingdao,92,6004,Zhou ming,F,19,Jinan,87,6005,Wang tao,M,18,Dalian,68;,11.3 结构体指针,11.3.1 指向结构体变量的指针 结构体变量所占内存单元的首地址称为结构体变量的指针。指向一个结构体变量的指针变量,称为结构体指针变量。结构体

16、指针变量中的值是所指向的结构体变量的指针。结构体指针变量定义的一般形式为:struct 结构体类型名*结构体指针变量名,有了结构体指针变量后,就能更方便地访问结构体变量的各个成员。利用指针引用结构体成员的一般形式为:(*结构体指针变量).成员名例如:(*pstu).num=6001;C语言中为了直观而方便地通过指针来引用结构体成员,专门设置了指向运算符“”来访问结构体成员,一般形式为:结构体指针变量-成员名例如:pstu-num=6001;,例11.4 编一程序,利用结构体指针处理结构体中的成员。struct student int num;char name10;char sex;int a

17、ge;char addr50;int score;main(),struct student stu=6001,Zhao zhen,F,18,Beijing,85,*pstu;pstu=,程序运行结果为:Number=6001,Name=Zhao zhen,Sex=FAge=18,Address=Beijing,Score=85Number=6001,Name=Zhao zhen,Sex=FAge=18,Address=Beijing,Score=85Number=6001,Name=Zhao zhen,Sex=FAge=18,Address=Beijing,Score=85,11.3.2 指

18、向结构体数组的指针 同前面讨论的指向数组的指针一样,结构体指针也可用于指向结构体数组。结构体指针变量指向一个结构体数组,这时结构指针变量的值是整个结构体数组的首地址。结构体指针变量也可指向结构体数组中的一个元素,这时结构体指针变量的值是该结构体数组元素的地址。,例11.5 利用结构体指针变量输出结构体数组。,图11.8 结构数组的指针,11.3.3 结构体指针作函数参数 结构体变量作函数参数采取的是“单向值传递”方式,系统将实参结构体的全部成员拷贝给被调用函数的形参。,例11.6 编写程序,用结构体指针变量作函数参数,计算一组学生的平均成绩和不及格人数。struct student int n

19、um;char name10;int score;stu5=6001,Zhao zhen,85,6002,Lin ping,57,6003,He fang,62,6004,Zhou ming,87,6005,Wang tao,48;main()struct student*ps;void aver(struct student*ps);ps=stu;aver(ps);,void aver(struct student*ps)int c=0,i;float ave,sum=0;for(i=0;iscore;if(ps-score60)c+=1;ave=sum/5;printf(average=.

20、2fncount=dn,ave,c);程序运行结果为:average=67.80count=2,11.4 链 表,11.5 联合体数据类型,11.5.1 联合体的定义,1联合体类型的定义定义一个联合类型的一般形式为:union 联合体类型名 类型标识符 成员名1;类型标识符 成员名2;类型标识符 成员名n;;,2联合体变量的定义(1)先定义联合体类型,再定义联合体变量。(2)定义联合体类型的同时定义联合体变量。(3)直接定义联合体变量。,union udata类型的联合体变量u,包含有3个成员i、c和f。注意,系统没有分别给成员i,c,f,分配1个字节,2个字节,4个字节共7个字节的存储空间,

21、而只分配一个成员项的空间,三个成员共同使用一块内存空间。但联合体union udata中各个成员项的数据长度又互不相同,所以应按其成员中数据长度最大的成员项f分配4个字节的内存空间。联合体变量u如果被赋予字符型值时就使用1个字节的存储空间,被赋予整型值时就使用2个字节的存储空间,被赋予实型值时,就使用4个字节的存储空间。udata中的3个成员c,i,f,共同占用同一段内存区的情况,如图11.21所示。,图11.21 联合体变量共同占用内存的情况,11.5.2 联合体变量的引用 使用成员运算符“.”引用联合体的成员,其一般格式为:联合变量名.成员名 例如u.i、u.c、u.f分别表示联合体变量u

22、的成员i、c、f。联合体变量的成员的使用方法与同类型的变量完全相同。但要注意的是,由于联合体成员共同占用一块内存单元,一个联合体变量,每次只能赋予一个成员值。因此某个时刻只能有一个成员变量起作用,其他的成员不起作用。并且在联合体变量中起作用的成员是最后一次存放的成员,即在存入一个新的成员后,原来的成员就因被覆盖而失去作用。,例11.15 分析下列程序的输出结果。main()union long a;int b;char c;m;m.a=65535;printf(ld d cn,m.a,m.b,m.c+66);程序运行结果为:65355-1 A,程序中给联合体m的成员赋值为65535。假如联合体

23、变量m在内存中分配的地址是2000H,那么m.a所占的内存空间为2000H到2003H连续的四个字节,其值为65535,在内存中的存储为(2000H)=(1111 1111)2,(2001H)=(1111 1111)2,(2002H)=(0000 0000)2,(2000H)=(0000 0000)2;m.b所占的内存空间为2000H和2001H连续的两个字节,于是m.b的值为1;m.c所占的内存空间为2000H,于是m.c的ascii值为255,程序中输出m.c+66,得到的是ASCII值为65的字符,于是输出A。,另外,可以通过指针来引用联合体的成员。其格式如下:(*指向联合体变量指针名)

24、.成员名或者指向联合体变量指针名-成员名例如:union udata u,*pu;pu=则指针pu指向联合体变量u,通过指针pu可以访问u中的各个成员。,例如:(*pu).i=23;表示将23赋给pu指向的联合体变量的成员i,或者pu-i=23 以上两种方法的效果是一样的,但在使用指针访问联合体成员时,通常使用指向运算符“”访问联合体成员。,假设pu指向联合体变量,则下面3个语句的效果是一样的。u.i=23;等价于(*pu).i=23;等价于pu-i=23 联合体的特征决定了它的应用远不如结构体应用那样广泛。但是实际应用中,常常会出现一些量相互排斥的情况,这时用联合体就非常方便。,11.6 枚

25、举数据类型,11.6.1 枚举类型的定义 枚举类型通过枚举一系列有序的标识符来定义。枚举类型定义的一般格式为:enmu 枚举名枚举分量名1,枚举分量名2,枚举分量名n;其中,enmu是定义枚举类型的关键字。枚举名遵循标识符命名规则,用于标识所定义的枚举类型。枚举分量也是一个合法的标识符,由用户根据需要自己确定,它们列出一个枚举变量可以具有的值,又称为枚举常量。枚举常量各自代表一个数值,因此它们之间有先后顺序,可以进行比较。,例如:enum week sun,mon,tue,wed,thu,fri,sut;定义了一个枚举类型enmu week,它由枚举常量sun、mon、tue、wed、thu、

26、fri和sut组成,即一个enmu week类型的枚举变量可以具有的值为sun、mon、tue、wed、thu、fri和sut。在C语言中,枚举类型中的枚举常量各自隐含一个int型值。在默认情况下,枚举常量的值从0开始,后一个总是比前一个大1。如在枚举类型week中,第一个枚举常量sun有值0,第二个枚举常量mon有值1,依次类推,最后一个枚举常量sat有值6,这是一种隐式定值方法。另外,在定义枚举类型时,还可以通过显式赋值的方法来确定枚举常量的值。,例如,enum week sun=7,mon=1,tue,wed,thu,fri,sat;这里,sun的值是7,mon的值是1,它们是通过显式赋

27、值的方式来确定其值的,tue没有被显式赋值,它的值是前一个枚举常量的值加1,即为2,同样wed值为3,sat的值是6。,11.6.2 枚举变量的定义和引用1先定义枚举类型,再定义枚举变量。2定义枚举类型的同时定义枚举变量。3直接定义枚举变量。,例11.17 编写程序,输入今天是星期几,计算并输出明天是星期几。程序如下:enum week sun,mon,tur,wed,thu,fri,sat;enum week tomorrow(day)enum day;int n;n=(int)day+1)7;return(enum week)n);main()enum week day1,day2;char*name=sun,mon,tur,wed,thu,fri,sat;int n;printf(n请输入0-6内的整数:);scanf(d,程序运行结果为:请输入0-6内的整数:3明天是:thu,11.7 自定义类型,自定义类型的一般形式为typedef 类型说明符 新类型名表;例如:typedef float REAL;typedef REAL*POINT;POINT p1,p2;,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号