一、union结构可以理解为是一种特殊的 struct 结构,特殊之处在于:
1、union内部可以包含各种属性,但同一时间只能使用一个属性,它保存的是最后写入(赋值)的属性值。
2、union结构也可以声明成指针,但指针的属性是变化的,哪个属性在用(也就是最后输入值的属性),哪个属性的数据类型就是它的指针应使用的类型。
3、union结构的大小与struct不同,struct 的大小大于等于它所有属性占用内存之和;union的大小是它的属性中占用内存最大的那一个。
二、union 结构与 struct 结构相近之处
1、定义union结构体与定义struct结构体方法近似。
2、声明union结构体变量与struct近似。
3、定义的union结构体也可起别名,起别名后也可以省去union关键字。
三、union结构优点:由于所有属性都保存在同一个内存地址,后面写入的属性会覆盖前面的属性,这样做的最大好处是节省内存空间。
四、enum(枚举)类型是一种取值只有少数(有限的)几种可能性的数据类型,由于每种取值都有自己的含义,为了提高代码的可读性,将它们定义为enum(枚举)类型。
五、定义 enum 类型格式很简单:enum 枚举类型名 {枚举值1, ... 枚举值n};。枚举值名字自动成为整数常量,编译器默认将"枚举值1"至"枚举值n"设为整数0至n-1,实际也可以理解为枚举值是整数值的代表,因为枚举值有含义,容易记。例如:
enum week { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday };
编译器默认为"Sunday设值0,Monday设值1,... ...",显然看代码时,使用这些枚举值比单纯记忆数值代表什么要容易;如果不想使用编译器默认的设置,可以自行设置,如{枚举值a=1000, 枚举值b=1500,... },但不能使用整数以外的值。
比如:enum Colors{RED=0xff0000, GREEN=0x00ff00, BLUE=0x0000ff}; //这样设置后,需要使用三种颜色的16进制值时,使用RED、GREEN、BLUE这三个枚举值既方便又易记。
六、枚举类型变量的声明与声明普通变量相同,用上面颜色的例子:
Colors color; color=RED; printf("RED=%#x",color); //运行结果:RED=0xff0000
七、枚举类型也可以起别名,方法与为结构体起别名一样:typedef enum {枚举值1,枚举值1, ... } 别名;,起别名后使用别名声明变量时,不再需要写enum命令。
八、由于enum的属性会自动声明为常量,因此可以利用这一特点声明常量,枚举类型名就不用要了。如:enum {MIN=0,MAX=10000}; //程序中就可以使用MIN、MAX这两个常量了。
九、enum 的作用域与变量相同。如果是在顶层声明,那么在整个文件内都有效;如果是在代码块内部声明,则只对该代码块有效。
十、有关union结构、enum类型的举例程序如下:
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
//使用匿名方式定义一个别名为myOil的Union结构体typedef union{int buket; //桶float litre; //升} myOil; //说明:油既可以论桶,也可以论升,桶为整数,升为小数,所以这个结构作为油的量度单位//很适合,需要哪个单位,就使用哪个单位,还不多占内存空间。
//声明一个union结构变量myOil m1;m1.buket = 20;m1.litre = 25.5;printf("myOil=%f\n", m1.litre); //运行结果:myOil=25.500000printf("myOil=%i\n", m1.buket); //运行结果:myOil=1103888384(虽未报错,但显示结果错误)//只有获取最后输入属性值才有正确结果
//如何正确使用union结构指针float* p = (float*) &m1; //如果用myOil* p=&m1; 这样得出的结果是错误的;如果用int* p=&m1; 结果同样是错误的。//因为最后输入的litre是float类型,所以要用float指针printf("myOil=%f\n", *p); //运行结果:myOil=25.500000
//以别名方式定义一个枚举类型typedef enum { RED = 0xff0000, GREEN = 0x00ff00, BLUE = 0x0000ff } Colors;Colors color = GREEN; //声明一个枚举变量printf("GREEN的RGB16进制值:%#x\n", color); //运行结果:0xff00color = RED; printf("RED=%#x\n", color);//运行结果:RED=0xff0000
//用枚举类型定义常量{enum { MIN=0,MAX=10000 };//MIN = 500; //如果我们写这个语句,会报错“表达式修饰可修改的左值”,证明MIN是常量printf("MAX的值:%d\n", MAX); //运行结果:10000}//printf("MAX的值:%d", MAX); //前面用{ }把定义常量括起来形成一个语句块,现在到了块外MAX//已不能识别,所以使用 enum 要注意作用域getchar();return 0;
}