### C语言关键字浅析系列 ###

### ISO/ANSI C 关键字 ###

union的字面意思是“联盟,同盟,联合”,表示一种团结的意象

union在C语言中称之为联合,该关键字和struct类似,也是声明了一种数据类型,具有自己的特点

 

union的作用是:

声明联合类型,即一种能在同一个存储空间里不同时地存储不同类型数据的数据类型。

 

1、联合的格式

从联合的定义上看,似乎是个晦涩难懂的概念,确实很多初学者、学生在遇到联合这个概念的时候需要细读方可学会,加之其不常用

久而久之容易对union的概念生疏,但其实联合的概念理解起来是不困难的,我们首先还是看看联合怎么建立:

/* 联合模板 */
union un   /* union关键字后跟自定义的联合名称 */
{
	int i;      /* 项目类型可以各异 */
	char c;
	double df;
};   /* 一定不能忘记分号 */

/* 定义联合变量 */
union un u_variable;   /* un类型的联合变量 */
union un u_array[10];  /* un类型的联合变量数组 */
union un * p_un;       /* un类型的联合变量指针 */

2、联合的使用

和结构类似,联合可以初始化和赋值:

union un u_var;
u_var.i = 1;      /* 可以用结构项目运算符.调用联合的项目并赋值 */
u_var.c = 'A';
u_var.df = 3.14;
union un u_var2 = u_var;   /* 可以把一个联合初始化给另一个联合 */
union un u_var3 = {12};    /* 对i成员初始化 */
union un u_var4 = {.df = 0.99};   /* 指定初始化 */

union un * p;  /* 联合类型指针的用法和结构struct是类似的 */
p = &u_var;
p->i = 3;

从联合的声明和定义甚至初始化语法上看,似乎和struct没有区别,但从存储的本质和用法上我们来看看区别:

union un u_var;
u_var.i = 12;     /* 存储12,使用4byte */
u_var.c = 'A';    /* 清除存储的12,存储'A',使用1byte */
u_var.df = 3.14;  /* 清除存储的'A',存储3.14,使用8byte */

u_var.i = 'C';           /* 清除存储的3.14,存储'C',使用1byte */
int sum = 1 + u_var.i;   /* 这时程序就会出错了,因为该联合变量这时候存储的是'C'字符 */

union终于暴露出其本质了,也就是说,同一时间内,一个联合变量被分配的存储空间中只能有一种变量值存在

这也是为什么当我们sizeof一个联合类型的时候,得到的是联合中占内存最大的类型的字节数了

所以和结构struct对比,他们的区别就在于:

结构变量的存储是按所有成员应该占有的空间之和来分配的,而联合变量的存储是按占空间最大类型的成员来分配的

struct stct     /* 占4+1+8=13byte */
{
	int i;      /* 4byte */
	char c;     /* 1byte */
	double df;  /* 8byte */
};

union un        /* 占8byte */
{
	int i;      /* 4byte */
	char c;     /* 1byte */
	double df;  /* 8byte,最大 */
};

 

——参考《C Primer Plus第五版》