跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
C 语言联合基础
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= C语言联合基础 = == 介绍 == '''联合(Union)'''是C语言中的一种复合数据类型,它允许在相同的内存位置存储不同的数据类型。联合与结构体(Struct)类似,但关键区别在于:联合的所有成员共享同一块内存空间,而结构体的每个成员拥有独立的内存空间。因此,联合在任何时候只能存储一个成员的值,修改一个成员会影响其他成员的值。 联合常用于以下场景: * 节省内存空间(特别是在嵌入式系统中)。 * 实现多态或类型转换(例如,将同一块内存解释为不同的数据类型)。 * 处理硬件寄存器或协议数据(如网络数据包解析)。 == 语法与定义 == 联合的定义语法与结构体类似,使用关键字<code>union</code>: <syntaxhighlight lang="c"> union UnionName { member_type1 member1; member_type2 member2; // 更多成员... }; </syntaxhighlight> 例如,定义一个包含<code>int</code>和<code>float</code>的联合: <syntaxhighlight lang="c"> union Data { int i; float f; }; </syntaxhighlight> == 联合的内存布局 == 联合的大小由其最大的成员决定。例如,上述<code>union Data</code>的大小为<code>sizeof(float)</code>(假设<code>float</code>比<code>int</code>占用更多空间)。 <mermaid> pie title 联合的内存分配 "int i" : 4 bytes "float f" : 4 bytes </mermaid> == 基本用法示例 == 以下代码演示联合的声明、赋值和访问: <syntaxhighlight lang="c"> #include <stdio.h> union Data { int i; float f; }; int main() { union Data data; data.i = 42; printf("data.i = %d\n", data.i); // 输出: data.i = 42 data.f = 3.14; printf("data.f = %f\n", data.f); // 输出: data.f = 3.140000 printf("data.i = %d\n", data.i); // 输出: data.i = 垃圾值(取决于浮点数的二进制表示) return 0; } </syntaxhighlight> '''注意''':修改<code>data.f</code>后,<code>data.i</code>的值变得无意义,因为两者共享同一内存空间。 == 实际应用案例 == === 1. 节省内存空间 === 在嵌入式系统中,联合可用于节省内存。例如,传感器数据可能以整数或浮点数形式存储: <syntaxhighlight lang="c"> union SensorData { int raw_value; float calibrated_value; }; </syntaxhighlight> === 2. 类型转换 === 联合可用于将同一块内存解释为不同类型: <syntaxhighlight lang="c"> union Converter { float f; unsigned char bytes[sizeof(float)]; }; int main() { union Converter conv; conv.f = 1.0f; // 打印浮点数的字节表示 for (int i = 0; i < sizeof(float); i++) { printf("byte[%d] = 0x%02X\n", i, conv.bytes[i]); } return 0; } </syntaxhighlight> 输出示例(取决于系统的小端/大端存储): <pre> byte[0] = 0x00 byte[1] = 0x00 byte[2] = 0x80 byte[3] = 0x3F </pre> === 3. 协议解析 === 联合可用于解析网络协议或硬件寄存器: <syntaxhighlight lang="c"> union Packet { uint32_t raw; struct { uint8_t header; uint8_t payload; uint16_t checksum; } fields; }; int main() { union Packet packet; packet.raw = 0xAABBCCDD; printf("Header: 0x%X\n", packet.fields.header); // 输出取决于字节序 return 0; } </syntaxhighlight> == 联合与结构体的区别 == {| class="wikitable" |- ! 特性 !! 联合(Union) !! 结构体(Struct) |- | 内存分配 || 所有成员共享同一内存 || 每个成员拥有独立内存 |- | 大小 || 由最大成员决定 || 所有成员大小之和(考虑对齐) |- | 用途 || 节省内存、类型转换 || 存储多个独立数据 |} == 注意事项 == 1. '''初始化''':只能初始化联合的第一个成员。 <syntaxhighlight lang="c"> union Data data = {10}; // 正确:初始化i </syntaxhighlight> 2. '''字节序问题''':跨平台时需注意大小端存储差异。 3. '''类型安全''':访问未赋值的成员可能导致未定义行为。 == 数学表示 == 联合的内存共享特性可表示为: <math> \text{Union Size} = \max(\text{Size}(m_1), \text{Size}(m_2), \ldots, \text{Size}(m_n)) </math> 其中<math>m_1, m_2, \ldots, m_n</math>为联合的成员。 == 总结 == 联合是C语言中一种高效利用内存的工具,适用于需要灵活解释数据的场景。正确使用时,它能显著减少内存占用,但需谨慎处理类型安全和平台兼容性问题。 [[Category:编程语言]] [[Category:C]] [[Category:C 语言结构体与联合]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)