C语言第14讲:自定义类型(联合 & 枚举)

本篇彻底搞懂 联合体(共用体)枚举类型,语法 + 内存 + 面试点 + 使用场景一篇到位!


📑 目录

  1. 联合体(共用体)
    • 声明与定义
    • 核心特点
    • 结构体 vs 联合体
    • 大小计算规则
    • 经典应用:判断大小端
  2. 枚举类型
    • 声明与赋值
    • 默认值规则
    • 枚举的优点
    • 使用方式
  3. 三大自定义类型对比表
  4. 总结

1. 联合体(共用体)union

联合体也叫共用体,和结构体语法相似,但内存管理完全不同。

1.1 声明格式

union 联合体名
{
    成员列表;
};

示例:

union Un
{
    char c;
    int i;
};

1.2 核心特点(最重要!)

  • 所有成员共用同一块内存空间
  • 修改一个成员会直接覆盖其他成员的值
  • 地址完全相同:&un == &un.c == &un.i
union Un un;
printf("%p\n", &un);
printf("%p\n", &un.c);
printf("%p\n", &un.i);

运行后你会发现:三个地址一模一样!

1.3 结构体 vs 联合体

struct:各成员独立占用内存,总大小 = 所有成员 + 内存对齐           

union:所有成员共用内存大小由最大成员决定(联合体变量的大小至少是最大成员的大小)

示例:

struct S { char c; int i; }; // 大小 8
union Un { char c; int i; }; // 大小 4

1.4 联合体大小计算规则

  1. 大小  至少 >= 最大成员的大小
  2. 大小必须是 最大对齐数 的整数倍

示例 1:

union Un1
{
    char c[5]; // 大小5,对齐数1
    int i;     // 大小4,对齐数4
};
// 最大对齐数4 → 总大小必须是4的倍数(5不是4的倍数)→ 总大小为 8

示例 2:

union Un2
{
    short c[7]; // 14字节,对齐数2
    int i;      // 4字节,对齐数4
};
// 最大对齐数4 → 14不是4的倍数,浪费2个字节→ 总大小为 16

1.5 联合体经典面试题:判断大小端

 先搞懂大端、小端(通俗版)

内存存数字时,字节的存放顺序不一样

  • 小端模式(你电脑 / Windows 默认)低字节放低地址(小的放前面)                                   例:数字 0x1234 → 内存存:34 12
  • 大端模式(网络 / 单片机)高字节放低地址(大的放前面)                                              例:数字 0x1234 → 内存存:12 34

利用 “成员共用内存” 的特性,最简单的大小端判断法:

int check_sys()
{
    union
    {
        int i;
        char c;
    }un;
    un.i = 1;
    // 返回1→小端;返回0→大端
    return un.c;
}

✅ 小端:低字节存低地址 → un.c = 1

✅ 大端:高字节存低地址 → un.c = 0


2. 枚举类型 enum

2.1 枚举是什么

枚举就是把有限、固定、可列举的值一一列出来,比如:星期、性别、颜色........

2.2 声明格式

enum 枚举名
{
    枚举常量1,
    枚举常量2,
    ...
};

示例:

enum Day
{
    Mon,
    Tues,
    Wed,
    Thur,
    Fri,
    Sat,
    Sun
};

2.3 默认值规则

  • 默认从 0 开始
  • 后一个比前一个 +1
  • 支持手动赋初值

示例:

enum Color
{
    RED = 2,
    GREEN = 4,
    BLUE = 8
};

2.4 枚举的优点(面试常问)

  1. 可读性极强:看到 RED 就知道是红色
  2. 有类型检查,比 #define 更安全严谨
  3. 便于调试,#define 预处理会被直接替换
  4. 一次定义一组常量,使用方便
  5. 遵循作用域,不会到处污染(枚举声明在函数内,只能在函数内使用)

2.5 枚举的使用

enum Color
{
    RED = 1,
    GREEN = 2,
    BLUE = 4
};

// 使用
enum Color clr = GREEN;
  • C 语言:允许用整数给枚举变量赋值
  • C++ :不允许,类型检查更严格

3. 结构体 + 联合体 + 枚举 最全对比表

特性结构体 struct联合体 union枚举 enum
关键字structunionenum
内存特点成员独立占用内存所有成员共用同一块内存本质是 int 常量
大小计算内存对齐,总大小≥成员总和大小 = 最大成员大小,且满足对齐大小等于 int
成员关系同时存在、互不干扰同一时间只用一个成员一组固定常量
访问方式变量. / 指针->变量. / 指针->直接使用枚举常量
适用场景描述对象的多个属性节省内存、类型转换、判断大小端状态标识、选项、固定取值
典型例子学生、员工、书籍大小端检测、协议解析星期、性别、颜色、状态码

4. 一句话总结

  • 结构体:把多个属性打包在一起,各自独立。
  • 联合体:多个成员共用内存,省空间、互斥使用
  • 枚举:定义一组有意义的常量,代码更清晰、更安全

✨ 结尾鼓励

联合体和枚举是 C 语言走向工程化、规范化编程的标志,学会它们,你的代码可读性、内存效率、专业度都会直接上一个台阶!面试更是高频考点,一定要吃透~

对你有帮助的话,欢迎 点赞、收藏、关注,C 语言全套精讲持续更新!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值