一 概述
二 类型
三 语句
四 函数
五 数据
六 内存
七 代码
附录
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
6. 联合
结构体(struct)各成员(field)具有不同内存位置,联合体(union)各成员共享相同起始位置。简单点说,就是以不同视角(field: type)访问同一数据。
内存长度由最长的成员决定。
#include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <assert.h> union date { // 4 字节数据: int _d; // . _d: 以整数访问。 unsigned char _b[4]; // . _b: 以字节数组访问。 // . date: 以结构体访问。 struct { signed short year; unsigned char month; unsigned char day; } date; }; int main (void) { union date d = { .date = { 2021, 4, 12 } }; // 按最长成员。 assert(sizeof(d) == 4); // 各成员共享同一内存,同一起始地址。 assert((void *)(&d._d) == (void *)(&d.date)); // 以不同方式共享同一数据。 assert((signed short)(d._d) == d.date.year); assert(d._b[2] == d.date.month); assert(d._b[3] == d.date.day); return 0; }
| 2021 | 4 | 12 | v +====+====+====+====+ | e5 | 07 | 04 | 0c | +====+====+====+====+ ^ | _d: int | _b: byte[4] | date: struct { year, month, day }
初始化
无 .member 初始化,只第一个有效。
union date d = { 10, (unsigned char[]){100, 101, 102, 103}}; ^ warning: excess elements in union initializer assert(d._d == 10);
使用 .member,最后一个表达式有效。
union date d = { .date = {2021, 4, 12}, ._d = 10 }; assert(d._d == 10);
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论