共用体、枚举和.ppt

上传人:牧羊曲112 文档编号:6553325 上传时间:2023-11-11 格式:PPT 页数:27 大小:335.65KB
返回 下载 相关 举报
共用体、枚举和.ppt_第1页
第1页 / 共27页
共用体、枚举和.ppt_第2页
第2页 / 共27页
共用体、枚举和.ppt_第3页
第3页 / 共27页
共用体、枚举和.ppt_第4页
第4页 / 共27页
共用体、枚举和.ppt_第5页
第5页 / 共27页
点击查看更多>>
资源描述

《共用体、枚举和.ppt》由会员分享,可在线阅读,更多相关《共用体、枚举和.ppt(27页珍藏版)》请在三一办公上搜索。

1、第19章 共用体、枚举和位域,通过本章的学习,需要掌握以下几点:共用体变量的定义和使用;枚举变量的定义和使用;位域变量的定义和使用。,19.1 共用体,共用体(union)是C语言中另一种高级数据结构,它可以使几个不同成员共享同一块内存。合理地使用共用体可以节省内存空间的使用,还可以简化多种复杂数据的处理。本节将讨论共用体类型的概念及其字节长度,以及讨论共用体变量的的使用。,19.1.1 共用体类型,在程序中,有时为了节约内存空间,可以使用共用体来使多个变量共享一块内存。共用体与结构体类似,可以含有多个成员,其声明形式如下:union 共用体名 数据类型名 成员名1;数据类型名 成员名2;数据

2、类型名 成员名3;,19.1.2 共用体变量,共有体变量的定义方法与结构体变量类似。可以先声明一个共用体类型,再使用该共用体类型来定义共用体变量;也可以直接定义共用体变量;还可以使用typedef来定义一个共用体类型别名,再使用共有体别名来定义共有体变量。仅以第三种形式为例,如下所示。typedef union _data_u_t int a;char b;long long c;data_u_t;data_u_t v;,19.1.2 共用体变量,使用共用体变量需要注意以下几点。由于共用体实际上只有一个有效成员,因此无法像初始化结构体那样使用多个值的序列对共用体进行初始化,只能使用含一个值的序

3、列对其初始化,如下所示。01data_u_t v=1,c,23LL;/*错误:不可以使用多个值的序列初始化共用体*/02data_u_t v=1;/*正确:只能使用一个值的序列初始化共用体*/,19.1.2 共用体变量,不可以直接为共用体变量赋值,需要通过赋值其成员来改变共用体的内存空间。在共用体中,对成员的访问和赋值都与结构体变量类似。例如:01v=2;/*错误用法*/02v.a=2;/*对a成员赋值*/03v.b=c;/*对b成员赋值,a成员的值已改变*/04v.c=23LL;/*对c成员赋值,a和b的值都已改变*/,19.1.2 共用体变量,虽然不能为共用体变量赋值,但可以使用共用体变量

4、来获得共用体的值。例如,下列代码中第2行和第3行的输出结果是一样的:01v.a=2;02printf(“%d”,v.a);03printf(“%d”,v);由于所有成员共享同一空间,因此所有成员的地址相同。,19.1.2 共用体变量,共用体可以作为数组元素,可以作为结构体成员,也可以作为共用体的成员。注意赋值的成员和访问的成员的一致性。例如:01v.a=2;02printf(“%dn”,v.a);/*对a成员赋值,所以访问a成员是可行的*/03printf(“%dn”,v.b);/*此时访问b是危险的,得到的是不可知值*/由于共用体中的所有成员共享一块空间,因此对任意成员的赋值都会影响其他成员

5、的值。,19.2 枚举,枚举类型是C语言中另一种高级类型。在前面已经学习了可以使用const常量和具名常量来代替程序中的出现的常量数值,枚举类型也可以用来定义常量数值。本节将先讨论枚举类型的概念和枚举类型的定义,再讨论枚举类型的使用场景。,19.2.1 定义枚举类型,在程序中,常常会处理一组相关的属性。例如,为了区别不同的颜色属性,一般会为不同的颜色分配一个常量值,如果用const常量可以作如下处理。const YELLOW=1;const RED=2;const BLUE=3;const BLACK=4;,19.2.1 定义枚举类型,可以以如下方式来使用这些const变量。car_colou

6、r=YELLOW;bike_colour=BLUE;这是一种可行的方法,但是存在最大的缺点是,在使用时无法显式地说明这些不同常量之间存在的关系,同时还无法自动限制这些const常量的值。,19.2.1 定义枚举类型,C语言使用枚举类型为这种情况下的常量替代提供了更好的解决方案。它可以在定义常量的同时,将这些常量结合在一个集合中加强彼此的关系。枚举类型的声明与结构体和共用体的声明略有不同,其形式如下:enum 枚举类型名 枚举成员1;枚举成员2;枚举成员3;,19.2.2 枚举类型的使用,使用枚举类型需要注意以下几点。1枚举成员值依次增加1定义枚举类型时,可以对枚举成员显式赋值,其后的枚举成员同

7、样在该值的基础上加1,如下所示。enum month_tAPR=4,MAY,JUN,NOV=11,DEC,JAN=1,FEB,MAR;,19.2.2 枚举类型的使用,2不要使用枚举成员之外的值初始化枚举变量虽然枚举类型都被处理为int型,但不可直接使用int型将枚举变量赋值。例如:enum month_t m=2;/*错误,类型不匹配*/编译器将警告该赋值表达式的类型不匹配。可以使用类型转换如下:enum month_t m=(enum month_t)2;/*正确*/虽然以上的做法是允许的,当请不要用int型数值来为枚举变量赋值,因为枚举类型本身就是为了替代int型数值而使用的,这种做法是枚

8、举类型变得毫无意义。,19.2.2 枚举类型的使用,3使用整型数值初始化只能使用整型来为枚举成员初始化。如下语句是错误的:enum fraction_tONE_QUA=0.25,TWO_QUA=0.5,THREE_QUA=0.75,FOUR_QUA=1.0;/*错误,不能使用整型外的数值初始化枚举成员*/若要替代整型外的常量数值,只能使用const常量(具名常量只用于switch结构的case标号和数组容量)。,19.2.2 枚举类型的使用,4不使用只有一个枚举成员的枚举类型不要声明只含一个枚举成员的枚举类型。例如:enum pi_t PI=3;因为枚举类型的一个优点是强化其多个枚举成员之间的

9、关系,如果只含一个枚举成员,使用枚举类型显得有些多余。这时应该使用const常量来代替,例如:const PI=3;,19.3 位域,在一些任务中,需要处理的信息都只需要占用1个或几个二进制位,这种情况下,如果使用一般的数据结构进行处理,会占用额外的空间,并增加多余的处理时间。这时可以使用C语言中的另一种数据结构“位域”(或称为“位段“)来处理该数据。本小节将先讨论位域的概念,再通过范例来讨论位域的字长的特性,最后还将分析位域成员的内存分布。,19.3.1 位域的概念,位域属于结构体,它允许在结构体内以位为单位将其空间划分为多个区域,并将其分配给结构体的各个成员。在程序中可以通过操作位域的各个

10、成员来操作其中的区域。利用位域可以使用较少的字节数来存储信息,其形式如下:,19.3.1 位域的概念,struct 结构体名/*定义位域成员*/unsigned 位域成员1:常量1;unsigned 位域成员2:常量2;int 位域成员3:常量3;int 位域成员4:常量4;/*定义其他普通成员*/数据类型名 成员1;数据类型名 成员2;,19.3.1 位域的概念,位域成员的类型只能为int型或unsigned型。位域成员声明中最后的常量值指定了该区域所占的位数,且该数值不能大于其数据类型所占位数。位域成员和普通成员的定义顺序可以交叉声明。位域成员的访问方式于普通成员访问方式完全一致。,19.

11、3.2 位域的字长,下面是一个位域类型的声明:01struct bit_type/*位域*/02unsigned a:1;/*a成员*/03unsigned b:2;/*b成员*/04unsigned c:3;/*c成员*/05unsigned d:4;/*d成员*/06;这个位域类型中有4个成员,成员a占1个字节,成员b占2个字节,成员c,占用3个字节,成员d占用4个字节。,19.3.2 位域的字长,但是该位域的字长不是各个成员所占位数的简单相加。位域的内存大小是以unsigned型的字长(也就是int型的字长)为最小单位的。如果其有效空间(即位域成员所占空间)少于unsigned型空间时,

12、那么整个unsigned空间都会分配给该类型。也就是说,bit_type结构体中的有效空间为10位,小于一个unsigned型空间,那么unsigned型本应占用的4个字节的其余空间也会分配给该位域类型,如下图所示。,19.3.3 位域成员的内存分布,在正常情况下位域中的位域成员的内存是相邻的。但是,位域成员所占空间是不能跨两个基本位域单元的,因此如果一个位域单元的剩余空间不能容纳一个位域成员,那么该单元剩余空间会被闲置,从下一单元开始存放该成员。例如,有以下位域类型:struct bit_filed_1 int a:16;int b:17;,19.3.3 位域成员的内存分布,由于位域成员a占

13、用了16位,该位域单元只剩16个字节,不足以分配给成员b。那么第一个位域单元的剩余16位被闲置,将第2个位域单元的开始17位分配给b,如下图所示。,19.3.3 位域成员的内存分布,此外,还可以人为地指定某一位域成员从下一位域单元开始分配。只要在该位域成员前声明一个长度为0的空成员即可,形式如下:struct bit_filed_2 int a:1;int:0;int b:1;,19.3.3 位域成员的内存分布,该位域类型中,位域成员a占用第一个位域单元的第一位;由于定义了1个空成员,下一个位域成员b将从下一单元开始分配,所以b占用的为第二个位域单元的第一位。该位域类型的长度为2个位域单元的长度,即8字节,如下图所示。,19.4 综合练习,1。试使用union和struct设计一个可以同时处理char型数据、int型数据和double型数据的数据类型;并设计两个函数,分别实现对这个数据类型的输入和输出,其函数声明如下:int input_value(数据类型名*v,void*data);/*将任意类型的数据data,赋值给v*/void output_value(数据类型名v);/*输出v的内容*/,

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

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


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号