1. 程式人生 > >C語言關鍵字淺析-union

C語言關鍵字淺析-union

### 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第五版》

 

相關文章:

C語言關鍵字淺析-struct

C語言關鍵字淺析-enum