一.什么是联合体:
像结构体一样,联合体也是由一个或多个成员变量组成的这些成员变量可以是不同的类型,但编译器只给最大成员分配足够的内存,联合体体内的成员都是公用一块空间的,因此联合体也叫做共同体
二.联合体类型的声明:
union Un//
{
char c;
int i;
};
int main()
{
union Un un={0};//
printf("%d",sizeof(un));
return 0;
}
//输出结果为4
和结构体很像其实
三.联合体的特点:
#include <stdio.h>
union Un
{
char c;
int i;
};
int main()
{
union Un un = {0};
printf("%p\n", &(un.i));
printf("%p\n", &(un.c));
printf("%p\n", &un);
return 0;
}
//最终三个输出结果都指向同一地址,更加说明了联合体内元素成员公用同一地址
四.结构体和结合体储存的区别:
五.联合体大小的计算:
#include<stdio.h>
union Un1
{
char a[6];
int b;
};
union Un2
{
short c[5];
int d;
};
int main()
{
printf("%d/n",sizeof(Un1));
printf("%d/n",sizeof(Un2));
return 0;
}
//输出结果为8 16
在Un1中虽然int 的类型要比char大,但char有五个元素,也就需要五个字节,在这种情况下,short就可以看做是Un1中最大的成员,那为什么最终输出结果是8而不是五呢?和结构体的规则类似,即使是联合体也需要最终成员元素和偏移值的对齐数为某个整数的倍数。
那么Un2也和Un1一同理,short 有六个元素,需要12个字节的大小,祖自宏结果又需要为某个整数的倍数,所以输出结果为16,而非12,。
六.联合体的应用:
那既然有结构体了,结构体也很方便和联合体也很像为什么还要学习联合体?答案就是在某些场景下联合体所占内存空间更少,可以减少无意义内存的占用。比如
为百货商店内的各类商品(书籍,裙子,玩具)便于管理,而设置一个程序:
解题:
先来分析三者都具有些什么属性:
书籍:价格,名称,作者
裙子:价格,名称,尺码
玩具:价格,名称,材质
三者具有相同的属性为价格,名称,不同的属性为作者,尺码,材质
如果仅仅通过结构体来编程,那最终的编程结果就是三个结构体
struct comm
{
//公共属性
price b;
name o;
//特殊属性
auther k;
size r;
tex z;
};
可是对于上述代码,在调用书籍的三个属性时裙子和玩具的特殊属性所占空间就被浪费掉了,但是如果通过联合体就可以避免空间被浪费
struct comm
{
double price ;
char name [20];
union a
{
struct book
{
char auther [20];
};
struct skirt
{
char size [20];
};
struct toy
{
char tex [20];
};
};
};
通过联合体修改后的代码就可在需要调用的书籍的三个属性时不会使裙子和玩具的特殊属性也占用空间了