联合体
联合体的定义
联合体是一种特殊的自定义类型,这种类型定义的变量也包含着许多成员(类型可以不同),特点是这些成员共用着同一块内存空间。
例如:
union My //定义联合体类型 { char c; int i; }; union My un; //定义联合体变量 int main() { printf("%zd\n", sizeof(un)); //计算联合体变量大小 return 0; }
联合体的特点
联合体的成员是共用同一块内存空间的,即联合体的大小至少是最大成员的大小。
union Un { char a; int i; }un; int main() { printf("%p\n", &(un.a)); //查看一下两个成员的地址 printf("%p\n", &(un.i)); return 0; }
由此也验证了,它门共用的是同一块内存空间。
联合体大小的计算
- 联合体大小至少是最大成员的大小
- 当最大成员的大小不是最大对齐数的整数倍时,就要对齐到最大对齐数的整数倍。
例如:
union Un1 { char c[5]; //最大成员是5,最大对齐数是四,所以对齐到8 int i; }; union Un2 { short c[7]; //最大成员是14,最大对齐数是4,所以对齐到16 int i; }; int main() { printf("%zd\n", sizeof(union Un1)); printf("%zd\n", sizeof(union Un2)); return 0; }
使用案例
int daxiao() { union Un { char a; //一个字节 int i; //四个字节 }un; un.i = 1; return un.a; } int main() { int ret = daxiao(); if (ret) printf("小端"); else printf("大端"); return 0; }
读取的第一个字节是一就是小端存储,是0就是大端存储。