【落羽的落羽 C语言篇】自定义类型——联合体、枚举

在这里插入图片描述

文章目录

  • 一、联合体
    • 1. 联合体类型的声明
    • 2. 联合体的特点
    • 3. 联合体的大小
    • 4. 联合体和结构体的对比
  • 二、枚举
    • 1. 枚举类型的声明
    • 2. 枚举类型的优点

一、联合体

1. 联合体类型的声明

联合体像结构体一样,也是由一个或多个成员构成,这些成员可以是不同的类型。它和结构体的区别在于:编译器只为联合体的最大的成员分配足够的内存空间,所有成员共用这一块内存空间。所以,联合体有时也叫共用体。
它的声明形式是:

union name
{
    member
    member
    ......
};

道理和结构体极为相似,union是C语言中的一个关键字,name自起,member是成员。使用方法也和结构体很相似。

2. 联合体的特点

  • 因为联合体的成员是共用一块内存空间的,所以给其中一个成员赋值,其他成员的值也会跟着变化。

  • 一个联合体变量的地址和其中任意一个成员的地址都是相同的。

  • 结构体成员同一时间只能使用一个。

3. 联合体的大小

  • 一个联合体变量的大小至少是最大的成员的大小。
  • 当最大成员的大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍的地址偏移处。(关于对齐数,详见上期结构体)

4. 联合体和结构体的对比

struct s
{
    char c1;
    int i1;
};

union u
{
    char c2;
    int i2;
};

根据内存对齐的规则,可以看到:

在这里插入图片描述

联合体相比结构体的优点是:在一些特定情况下,使用联合体不影响成员数据的使用,而可以节省内存空间。

在这里插入图片描述

二、枚举

1. 枚举类型的声明

枚举,顾名思义,一一列举,把可能的结果一一列举。
比如,星期一到星期日,可以一一列举。
一年的12个月,也可以一一列举。

枚举的声明方式是:

enum name
{
    member,
    member,
    ......
    //注意,member后是逗号,最后一个成员后不写逗号
};

enum是C语言中的一个关键字,member是枚举类型的可能取值,也叫枚举常量。
这些所有的可能取值都是有值的,从0开始,依次加1。或者自定义可能取值的值,未自定义的默认是上一个枚举常量的值加1。
有了枚举常量,以后的代码中出现同一个变量时,这个变量自动被替换成它的枚举常量。

比如:

enum day
{
    Mon,//0
    Tues,//1
    Wed//2
};
//在下面的代码中,Mon就是0,以此类推

enum color
{
    red=2,//2
    blue,//3
    green=5,//5
    yellow//6
};
//在下面的代码中,red就是2,以此类推

在这里插入图片描述

2. 枚举类型的优点

我们也可以用#define定义常量,为什么要有枚举的存在呢?
枚举独特的优点是:

  • 增加代码的可读性和可维护性。
  • 便于调试,预处理阶段会删除#define定义的符号。
  • 使用方便,一次可以定义多个变量。
  • 枚举常量遵循作用域规则,枚举声明在函数内的话,也就只能在函数内使用。

在这里插入图片描述

本篇完,感谢阅读

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值