C 语言高级数据结构 之 联合
当多个数据需要共享内存或者多个数据每次只取其一时,可以利用联合体(union),与结构不同,当定义联合时,计算机只为其中一个字段分配空间
在 C Programming Language 一书中对于联合体是这么描述的:
- 联合体是一个结构
- 它的所有成员相对于基地址的偏移量都为 0
- 此结构空间要大到足够容纳最 宽 的成员
- 其对齐方式要适合其中所有的成员
union U { char s[9]; // 占 9 个字节 int n; // 占 4 个字节 double f; // 占 8 个字节 }; printf("sizeof:%i", sizeof(union U)); // 16
这里定义了一个联合 U,最大占 9 个字符,所以该联合最宽应该是 9,但为啥是 16 呢,这里存在字节对齐的问题,9 既不能被 4 整除,也不能被 8 整除。因此补充字节到 16,这样就符合所有成员的自身对齐了。从这里可以看出联合体所占的空间不仅取决于最宽成员,还跟所有成员有关系,即其大小必须满足两个条件:
- 大小足够容纳最宽的成员
- 大小能被其包含的所有基本数据类型的大小所整除
参考:浅谈 C 语言中的联合体
1.使用联合
保存第一个字段的值
quantity q = {4};
指定初始化器:按名设置联合字段的值
quantity q = {.weight=1.5}; //
点表示法
quantity q; // 创建联合变量 q.volume = 4.3; // 设置字段的值
对于结构的初始化,注意第三种情况:
// 成功 sms m = {2.0, 1.0, {0.7}}; //失败 sms m; m = {2.0, 1.0, {0.7}};
因为 {}
符号结构要和结构声明写在一行,编译器才知道是结构,否则表示数组。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
上一篇: C 语言高级数据结构
下一篇: 彻底找到 Tomcat 启动速度慢的元凶
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论