当前位置: 首页 > news >正文

C语言初学笔记【联合与枚举】

文章目录

  • 前言
  • 一、联合体
    • 1. 联合体类型的声明
    • 2. 联合体的特点
    • 3. 联合体 vs 结构体
    • 4. 联合体大小的计算
    • 5. 联合体的应用
  • 二、枚举类型
    • 1. 枚举类型的声明
    • 2. 枚举的优点
    • 3. 枚举的使用
  • 三、补充说明
  • 总结


前言

学习笔记:自定义类型——联合和枚举


一、联合体

1. 联合体类型的声明

· 联合体是一种自定义类型,允许在同一内存空间中存储不同类型的成员。
· 语法类似于结构体,但所有成员共享同一块内存。
· 示例:

union Un {char c;int i;
};

2. 联合体的特点

· 所有成员共用同一块内存空间。
· 修改一个成员会影响其他成员的值。
· 联合体的大小至少等于其最大成员的大小。
· 示例:

union Un un;
un.i = 0x11223344;
un.c = 0x55; // 此时 un.i 的值变为 0x11223355

3. 联合体 vs 结构体

· 结构体每个成员有独立的内存空间,联合体所有成员共享同一内存。
· 结构体大小等于所有成员大小之和(考虑对齐),联合体大小等于最大成员大小(考虑对齐)。

4. 联合体大小的计算

· 联合体大小至少是最大成员的大小。
· 如果最大成员的大小不是最大对齐数的整数倍,则需对齐到最大对齐数的整数倍。
· 示例:

union Un1 {char c[5]; // 5字节int i;     // 4字节,对齐数为4
};
// sizeof(union Un1) = 8(对齐到4的倍数)

5. 联合体的应用

· 节省内存,适用于同一时间只使用其中一种成员的场景。
· 示例:礼品兑换单中不同类型的商品属性共用同一内存。

1.6 练习:判断机器字节序(大端/小端)

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

二、枚举类型

1. 枚举类型的声明

· 枚举用于定义一组具名的整型常量。
· 语法:

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

· 默认从0开始递增,也可手动赋值:

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

2. 枚举的优点

  1. 增强代码可读性和可维护性:使用有意义的名字代替数字。
  2. 类型检查:比 #define 更严谨,有类型信息。
  3. 便于调试:枚举常量在编译阶段保留,而 #define 在预处理后被替换。
  4. 一次定义多个常量:简洁高效。
  5. 作用域规则:枚举类型遵循作用域,可限制使用范围。

3. 枚举的使用

· 定义枚举变量:

enum Color clr = GREEN;

· C语言中可用整数值给枚举变量赋值,C++中不允许(类型不同)。


三、补充说明

· 联合体常用于底层编程、内存优化和类型转换场景。
· 枚举适用于状态机、选项配置等需明确含义的场合。

✅ 建议多通过代码实践理解联合体和枚举的内存布局和使用场景。


总结

特性联合体枚举
内存使用共用内存,节省空间不占额外内存(仅是整型常量)
用途同一时间只使用一个成员定义一组相关的命名常量
类型安全弱类型强类型,C++中更严格
可读性低(需谨慎使用)高(语义明确)

http://www.dtcms.com/a/345018.html

相关文章:

  • Unreal Engine USceneComponent
  • 如何实现二维CAD与3D建模工程图关联一体化出图 | 中望3D 2026新亮点
  • android sdk 虚拟机是否可以通过命令行打开?
  • 数字逻辑与数字系统设计之电梯控制器设计
  • 防爆连接器在防爆箱上的作用
  • shell脚本第二阶段-----选择结构
  • Unreal Engine IWYU Include What You Use
  • DLT645仪表通信,串口助手调试读写地址
  • 【C#】观察者模式 + UI 线程调度、委托讲解
  • vuex如何在js文件中使用
  • NVIDIA GB200 架构详解及与 B200/H200/H100 的区别
  • 【芯芯相印】芯片设计生产全流程核心技术术语与实践指南:从架构定义到量产交付的完整图谱
  • NLP学习之Transformer(2)
  • 数据预处理学习笔记
  • Thunderbird 将推出在德国托管的加密电子邮件服务
  • Android Jetpack | Hilt
  • 快速了解深度学习
  • 数学建模--Topsis(Python)
  • 学习python第12天
  • 第5.3节:awk数据类型
  • gcc 和 make 命令
  • 机试备考笔记 17/31
  • 打工人日报20250822
  • Redis 部署模式深度对比与选型指南
  • 计算机毕设大数据方向:电信客户流失数据分析系统技术实现详解
  • ​如何用 Windows 10 ISO 文件重装系统?U盘安装教程(附安装包下载)
  • Kubernetes 调度器 详解
  • 加密货币与区块链:六大刑事重灾区
  • Vue3源码reactivity响应式篇之Reactive
  • 阿里云日志服务与Splunk集成方案(Splunk Add-on方式)实战