前面我们介绍了自定义类型的结构体和枚举,现在来介绍最后一种联合!
目录
1.联合类型的定义
1.联合,又称共用体(union),它的使用方法和结构体类似,没有枚举那么简单
2.这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间
为什么说公用一块空间呢?我们看一下它们的地址就明白了:
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> union UN { char c; int i; }; int main() { union UN un; printf("%d\n", sizeof(un)); printf("%p\n", &un); printf("%p\n", &un.c); printf("%p\n", &un.i); return 0; }
代码运行后我们发现这个联合的大小是4个字节,然后联合成员变量和联合名的地址是相同的,这就充分说明了它们公用一块空间,为什么大小是4个字节,我们在下面解释
2.联合的特点
联合的成员共用同一块内存空间,这样一个联合变量的大小,至少是最大成员的大小(因为联合至少得有能力保存那个最大的成员)
3.联合体的大小
1.联合的大小至少是最大成员的大小
2.当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍(可能存在,不是一定的)
我们可以验证一下这个对齐数:
typedef union Un1 { char c[5];//占5个字节 int i;//占4个字节 }Un1; typedef union Un2 { short c[7];//2*7是14个字节 int i;//4个字节 }Un2; int main() { printf("%d %d\n", sizeof(Un1), sizeof(Un2)); return 0; }
我们可以分析,如果它们没有对齐的话,所占的内存Un1是5个字节,Un2是14个字节,但是结果是8个字节和16个字节,所以它们内存对齐了
4.联合的使用
我们应用联合来判断当前机器为大端还是小端
我们在什么是大端存储,什么是小端存储这篇博客中详细介绍了大端和小端,感兴趣的伙伴们可以去看看
大端:低位存在高地址,高位存在低地址
小端:低位存在低地址,高位存在高地址
我们这里介绍两种求法:
方法1:是平时我们用到的求法,和博客中提到的求法相同,这里就不进行过多说明
int main() { int a = 1; if (*(char*)&a == 1) { printf("小端\n"); } else printf("大端\n"); return 0; }
方法2:使用联合
union UN { char c; int i; }; int main() { union UN un; un.i = 1; if (un.c == 1) printf("小端\n"); else printf("大端\n"); return 0; }
联合体的知识就是这些,用到某些具体的实例中,大大方便了我们程序的设计,本期就到这里,我们下期再见!