C语言联合体与枚举类型深入解析
c语言中的共用体是什么?
所谓联合类型是指将不同的数据项组织为一个整体,它们在内存中占用相同的存储单元。其定义形式为:UNION联合名{成员表列};联合数据{inta;floatB;}obj;该形式定义了联合数据类型UnionData。
UNION数据类型在结构上非常相似,但其含义和存储完全不同。
我们先来看一个小例子。
uniondata/*union*/{int;floatb;dbc;chard;}mm;structstud/*struct*/{int;floatb;dblc;chard;};main(){structstudstudent;printf("%d,%d",sizeof(structstud),sizeof(uniondata);}运行程序输出:15,8程序输出显示,结构体类型占用的内存空间为结构体类型占用的存储空间每个成员的空间总和。
看起来像结构体的联合类型实际上占用了其最长成员所占用的存储空间。
对联合成员的引用与对结构成员的引用相同。
但是,由于联合体的每个成员共享相同的内存空间,因此在使用时,请根据需要使用其中一个成员。
图中具体说明了UNION的特点,方便程序员在同一内存区域交替使用不同的数据类型,增加灵活性,节省内存。
联合变量的成员可以像结构体一样被引用。
如果联合类型定义为:uniondata/*union*/{inta;floatb;doublec;chard;}mm;其成员参考号为:mm.a、mm.b、mm.c、mm.d、但请注意,是的,不能同时引用四个成员,并且同一时间只能使用一个成员。
main(){uniondata{inta;floatb;doublec;chard;}mm;mm.a=6;printf("%d\n",mm.a);mm.c=67.2;printf("%5.1lf\n",mm.c);mm.d='W';mm.b=34.2;printf("%5.1f,%c\n",mm.b,mm.d);}运行程序的输出是:667.234.2,=程序最后一行的输出是意外的。
这是因为mm.d='W';毫米b=34.2;由于连续两次赋值语句,将联合变量mm.b的成员占用的4个字节写入34.2,写入的字符被覆盖,输出字符变成“=”符号。
事实上,字符输出是未知的,由写入内存的数据决定。
虽然例子很简单,但是它展示了联合变量的正确使用。
C语言的一个问题
Bprintf("%c\n",u1.n);//n未设置值。c语言里的union和enum怎么用
1.Union
Union允许根据不同的数据类型访问同一块内存,数据实际上存储在同一位置。
它的声明和用法与结构体非常相似,但实际功能完全不同:
union中声明的所有元素占用相同的内存空间,其大小为声明中最长元素的大小。
例如:
定义了三个元素:
每一个都是不同的特定类型。
由于它们都指向相同的内存空间,因此更改一个元素的值将影响所有其他元素的值。
union的一种用途是将较长的基本类型与由其他较小数据类型组成的结构体或数组组合在一起,例如:
联合mix_t{长l;{ 短 hi; 短 lo; } s; charc[4];}mix;上面的例子中,定义了3个名字:mix.l、mix.s和mix.c通过这3个名字来访问同一个4字节的内存空间。
至于使用什么名字来访问,取决于你想要使用的数据类型,是long、short还是char。
下图展示了这个联合(union)的各个元素在内存中可能的结构,以及如何通过不同的数据类型来访问它:
2.枚举
1.枚举定义
枚举类型定义的一般形式为:
在枚举中,值表必须列出所有可用的值。
这些值也称为枚举元素。
例如:
这个枚举称为“星期几”,有7个枚举值,即一周中的7天。
声明为星期几类型的变量的值只能是7天之一。
2、枚举变量的描述
与结构体和联合体一样,枚举变量也可以有不同的描述方式,即先定义然后解释。
还可以设置指令或直接指令。
假设变量a、b、c被描述为上面提到的星期几,可以使用以下方法之一:
或者:
或:
三、枚举类型变量的赋值和使用
枚举类型的使用遵循以下规定:
.枚举值是常量,而不是变量。
不能在程序中使用赋值语句为其赋值。
例如,将以下值赋给星期枚举的元素:
他们都错了。
b.枚举元素本身被系统定义为代表序号的数值,从0开始,按顺序定义为0,1,2....例如,在星期,太阳值为0,星期一值为1,...,星期六值为6。
说明:
只能将枚举值赋值给枚举变量,元素值不能直接赋值给枚举变量。
:
正确。
且:
为假。
如果需要给枚举变量赋值,则必须使用强制类型转换。
例如:
其含义是用顺序改变枚举number2将枚举元素赋值给枚举变量a相当于: