news 2026/5/5 12:17:26

C 语言自定义类型:联合体 + 枚举(全网最细讲解)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C 语言自定义类型:联合体 + 枚举(全网最细讲解)

大家好,今天带来 C 语言联合体(共用体)枚举类型的完整精讲。这两个是 C 语言自定义类型的最后两块拼图,面试常考、开发常用。


目录

  1. 联合体类型的声明
  2. 联合体的特点
  3. 联合体大小的计算
  4. 联合体实战:判断大小端
  5. 枚举类型的声明
  6. 枚举类型的优点
  7. 枚举类型的使用
  8. 全文总结
  9. 面试高频考点

1. 联合体类型的声明

联合体(union)也叫共用体,和结构体类似,但所有成员共用同一块内存空间

// 联合类型声明 union Un { char c; int i; }; int main() { // 定义联合变量 union Un un = {0}; printf("%d\n", sizeof(un)); // 输出 4 return 0; }

2. 联合体的特点

  1. 所有成员共用同一块内存
  2. 给一个成员赋值,会覆盖其他成员的值
  3. 联合体大小至少是最大成员的大小
// 验证地址相同 union Un { char c; int i; }; int main() { union Un un = {0}; printf("%p\n", &(un.i)); printf("%p\n", &(un.c)); printf("%p\n", &un); // 三个地址完全一样! return 0; }
// 赋值覆盖示例 union Un un = {0}; un.i = 0x11223344; un.c = 0x55; printf("%x\n", un.i); // 输出:11223355

3. 联合体大小的计算

规则:

  1. 至少是最大成员的大小
  2. 必须是最大对齐数的整数倍
union Un1 { char c[5]; // 5字节 int i; // 4字节 }; // 最大对齐数 4 → 5 → 对齐到 8 printf("%d\n", sizeof(union Un1)); // 8 union Un2 { short c[7]; // 14字节 int i; // 4字节 }; // 最大对齐数 4 → 14 → 对齐到 16 printf("%d\n", sizeof(union Un2)); // 16

4. 联合体实战:判断大小端

面试高频手写题:用联合体判断机器大小端。

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

5. 枚举类型的声明

枚举就是把可能的值一一列举,枚举常量默认从0开始,依次 + 1。

// 星期 enum Day { Mon, Tues, Wed, Thur, Fri, Sat, Sun }; // 性别 enum Sex { MALE, FEMALE, SECRET }; // 颜色(可赋初值) enum Color { RED = 2, GREEN = 4, BLUE = 8 };

6. 枚举类型的优点

相比#define,枚举更强大:

  1. 代码可读性、可维护性更强
  2. 类型检查,更严谨
  3. 便于调试,#define 在预处理阶段就消失
  4. 一次可定义多个常量
  5. 遵循作用域规则

7. 枚举类型的使用

enum Color { RED = 1, GREEN = 2, BLUE = 4 }; int main() { // 使用枚举常量赋值 enum Color clr = GREEN; printf("%d\n", clr); // 2 return 0; }

注意:

  • C 语言:可以用整数给枚举变量赋值
  • C++:不允许,类型检查更严格

8. 全文总结

联合体(union)

  • 成员共用内存,空间复用
  • 大小 = 最大成员大小,且对齐到最大对齐数
  • 常用于大小端判断、节省内存、数据覆盖场景

枚举(enum)

  • 把取值一一列举,默认从 0 开始
  • 比 #define更安全、更易读、更好调试
  • 适合状态、类型、选项等固定值场景

9. 面试高频考点

  1. 联合体和结构体的区别
  2. 联合体大小计算规则
  3. 手写联合体判断大小端
  4. 枚举与 #define 的区别
  5. 枚举常量默认值规则
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/5 12:07:26

Tiled地图编辑器终极指南:从零开始创建专业2D游戏地图

Tiled地图编辑器终极指南:从零开始创建专业2D游戏地图 【免费下载链接】tiled Flexible level editor 项目地址: https://gitcode.com/gh_mirrors/ti/tiled Tiled是一款强大而灵活的2D地图编辑器,专为游戏开发者设计。无论你是独立开发者还是团队…

作者头像 李华
网站建设 2026/5/5 12:05:26

AI智能体安全支付中间件:MoneyClaw架构设计与OpenClaw集成实战

1. 项目概述:为AI智能体赋予支付能力的“金钱之爪”如果你正在探索如何让AI智能体(Agent)在真实世界里完成在线支付、管理订阅,而不是仅仅停留在对话和文本生成,那么你很可能已经遇到了一个核心难题:如何安…

作者头像 李华
网站建设 2026/5/5 12:02:26

MAGI:AI原生文档格式,为RAG与智能体注入结构化灵魂

1. 项目概述:为什么我们需要一个“AI原生”的文档格式?如果你最近在折腾大语言模型应用,特别是RAG或者智能体,那你肯定遇到过这个头疼的问题:怎么把那些五花八门的文档——网页、PDF、Word、甚至内部Wiki——喂给AI&am…

作者头像 李华
网站建设 2026/5/5 12:01:27

RandOpt随机优化算法:原理、实现与性能对比

1. 项目背景与核心价值 在深度学习模型训练过程中,优化算法的选择往往直接影响模型的收敛速度和最终性能。传统优化器如SGD、Adam虽然被广泛使用,但在面对复杂非凸优化问题时,依然存在陷入局部最优、超参数敏感等问题。RandOpt(随…

作者头像 李华