news 2026/5/23 6:52:17

C 语言自定义类型:结构体、位段、联合体、枚举

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C 语言自定义类型:结构体、位段、联合体、枚举
  • struct:成员并排,空间叠加
  • 位段:struct 里按 bit 分配,极致省空间
  • union:成员重叠,空间共享
  • enum:有限常量,替代宏,更安全
  • 一、结构体 struct:成员并排,空间叠加

    1. 基本声明

  • 2. 内存对齐

    对齐规则

  • 1.首成员偏移为 0
  • 2.后续成员对齐到:min(默认对齐数, 自身大小)的整数倍
  • 3.总大小是最大对齐数的整数倍
  • 4.嵌套结构体:内部对齐到自身最大对齐数
  • 3. 结构体传参:优先传地址

  • 传整个结构体:拷贝,开销大
  • 传指针:直接访问,高效
  • 技巧:省空间技巧:小成员放一起
  • void print(struct S* ps) { ps->i; }
  • 二、位段:结构体里抠 bit,极致省空间

    1. 什么是位段

    在 struct 中用:n指定占用多少 bit

  • 2. 内存分配

  • int(4字节)char(1字节)为单位开辟
  • 跨平台(大小端、分配方向)不确定
  • 3. 注意

  • 不能取地址&s.a(bit 无地址)
  • 适合网络协议、寄存器、标志位
  • 三、联合体 union:成员重叠,空间共享

    1. 声明与特点

    union Un { char c; int i; };
  • 所有成员共用同一块内存
  • 大小 =最大成员大小,并对齐
  • 赋值演示:
  • 3. struct vs union 对比

  • struct:叠加sizeof=8
  • union:重叠sizeof=4
  • 四、枚举 enum:有限常量,替代宏

    1. 声明

    enum Color { RED, // 0 GREEN, // 1 BLUE // 2 };

    可手动赋值:

  • 2. 优点(对比 #define)

  • ✅ 可读性高
  • ✅ 有类型检查,更安全
  • ✅ 调试可见(宏会被删除)
  • ✅ 作用域可控
  • 3. 使用
  • 五、总结
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/23 6:47:58

有没有前端的“牛人”哇,自己公司招募伙伴

1、负责公司Web前端产品的设计与开发,完成高质量的代码实现 可利用Claude code等编程工具; 2、参与产品需求分析与技术方案制定,持续优化系统性能与用户体验; 3、与后端开发协作,确保接口联调高效、数据交互准确&a…

作者头像 李华
网站建设 2026/5/23 6:47:53

为什么高级的棕色,永远是大自然原创,而非工厂复刻?

在审美高度同质化的当下,我们的配饰、穿搭、生活好物,似乎都逃不开工业调色的桎梏。市面上的棕色系美学层出不穷:摩卡棕、复古棕、焦糖棕、奶咖棕……这些被精心调试的流行色,看着精致干净,却有一个共同的短板——没有…

作者头像 李华
网站建设 2026/5/23 6:44:57

FlexNet许可服务器权限配置错误解决方案

1. 问题现象与背景解析最近在配置FlexNet Publisher(FNP)许可服务器时,遇到了一个典型问题:通过LMTOOLS工具添加新服务后,无论是启动还是停止服务都报错。启动时报"VD is starting, please check vendor daemons …

作者头像 李华
网站建设 2026/5/23 6:44:55

Arm Development Studio静默安装与自动化部署指南

1. Arm Development Studio 静默安装指南作为一名嵌入式开发工程师,我经常需要在多台设备上部署Arm Development Studio(简称Arm DS)开发环境。手动点击安装不仅效率低下,在自动化部署场景下更是无法接受。经过多次实践&#xff0…

作者头像 李华
网站建设 2026/5/23 6:44:48

Keil MDK中FlexNet许可证错误-7,10015和-4的解决方案

1. 问题背景与现象解析在Keil MDK开发环境中使用FlexNet Publisher(FNP)授权系统时,工程师可能会遇到两个典型的许可证错误代码:-7,10015和-4。这两个错误通常发生在手动借用(Check-Out)和归还(…

作者头像 李华
网站建设 2026/5/23 6:43:01

内连接,左连接,右连接怎么区别开来?

区分这三种连接其实非常简单,核心就在于看**“谁的数据必须全部保留,谁的数据没有匹配就要被过滤掉”**。 为了让你彻底搞懂,我们可以把 user 表(用户)和 orders 表(订单)想象成两个班级&#x…

作者头像 李华