C语言从头学41——union(联合)结构、enum(枚举)类型

一、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.500000
    printf("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); //运行结果:0xff00
    color = 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;
}

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值