与结构体一样,联合体也是由多个成员组成,但是编译器只为最大的成员分配足够的空间,联合体的所有成员共用一块空间,所以联合体也叫共用体。
1.声明:类似结构体的声明,只是名字是union不是struct。声明并计算一下大小和打印地址:
union Un
{char c;int i;
};int main()
{union Un u = { 0 };printf("%zd\n", sizeof(u));printf("%p\n", &u);printf("%p\n", &(u.c));printf("%p\n", &(u.i));return 0;
}
由此也可以知道联合体内部成员共用一块地址,也就是说它们叠在了一起,所以同一时间只能使用一个成员,改了c的值i也会改,改了i的值c也会改。
2.大小:但其实联合体的总大小也得是最大成员对齐数的整数倍,就比如:
union Un
{char c[5];int i;
};int main()
{union Un u = { 0 };printf("%zd\n", sizeof(u));return 0;
}
char类型是一个字节,与vs的默认对齐数相比较小,int类型是4个字节,所以最大的对齐数是4,由于联合体需要给最大的成员足够的内存空间,此时这个最大成员是char c[5],所以先给5个字节,然后还要是4的整数倍,所以就是8了。
3.联合体的应用:
现有一个活动,要上线一个礼品兑换单,礼品兑换单有三种商品:图书、杯子、衬衫。
每一种商品都有:库存量、价格、商品类型和与商品类型相关的其他信息:
图书:书名、作者、页数
杯子:设计
衬衫:设计、可选颜色、可选尺寸
分类一下,每种商品都有的属性叫做公共属性,自己特有的叫特殊属性。如果把上述属性全部设计成一个结构体的话,空间会偏大,而且所有的属性不会同时出现,有一些特殊属性就会使用不到,造成空间的浪费,这时候可以配合联合体来设计。
struct gift_list
{int stock_number;//库存量double price;//定价int item_type;//商品类型union {struct{char title[20];//书名char author[20];//作者int num_pages;//页数}book;struct{char design[30];//设计}mug;struct{char design[30];//设计int colors;//颜色int sizes;//尺寸}shirt;}item;
};
把特殊属性用联合体包括起来,可以在一定程度上节省空间。
以上就是本节的全部内容了。