|
聯合 Union 是一種將不同資料型態儲存在同一個記憶體空間的特殊資料型態,也就是說,所有在 union 宣告的變數會共享同一個記憶體空間,而且會以宣告的變數型態 size 最大的變數空間作為記憶體空間。
下列以圖示,示範程式
程式 | 記憶體配置圖 |
#include <stdio.h>
#include <stdlib.h>
union unionType{
int x;
char y[2];
char z;
}a;
int main(int argc, char *argv[]){
a.x=0;
a.z="1";
printf("a.x=%d , a.y[0]=%c\n",a.x, a.y[0]);
printf("address : a.x=%ld , a.y[0]=%ld , a.y[1]=%ld ,
a.z=%ld\n", &a.x, &a.y[0], &a.y[1], &a.z);
printf("size : a=%d , a.x=%d , a.y[0]=%d , a.z=%d\n",sizeof(a) , sizeof(a.x), sizeof(a.y[0]) ,
sizeof(a.z));
}
|
|
程式宣告一個名為 a 的 union 型態變數,裡面一共有 1 個名為 x 的 int,1 個名為 y 的兩空間 char 陣列及 1 個名為 z 的 char。
這裡面以 int 使用 4 bytes 為最大使用空間,因此 a 總大小為 4 bytes。
y 陣列的第 0 個空間與 x 的第 0 bytes 及 z 共用。依程式執行結果,它們都是從記憶體位址 4225568 開始。
程式先執行 a.x = 0,使得 a 的 4 個 bytes 皆清除為 0,再以 a.z="1" 設定 a 的第 0 bytes 為 "1" (相當於 ASCII 值為 49)。
因共用的關係,當 a.z 改變後,會連帶影響 int x 與 char y[0]。
union 之定義、宣告、使用,與 struct 一樣,大略有三種方式。
union 定義方式: |
union 聯合名稱{
資料型態 聯合成員名稱1;
資料型態 聯合成員名稱2;
..................
資料型態 聯合成員名稱n;
}變數名1,變數名1,...,變數名n;
//變數宣告為 union 者可以在此宣告
範例:
union unionT{
int x;
char y[2];
char z;
}a;
|
typedef union 聯合名稱 另一個聯合名稱;
union 聯合名稱{
資料型態 聯合成員名稱1;
資料型態 聯合成員名稱2;
..................
資料型態 聯合成員名稱n;
}變數名1,變數名1,...,變數名n;
範例:
typedef union unionT UnionT;
union unionT{
int x;
char y[2];
char z;
}a;
|
typedef union 聯合名稱{
資料型態 聯合成員名稱1;
資料型態 聯合成員名稱2;
..................
資料型態 聯合成員名稱n;
}另一個聯合名稱;
範例:
typedef union UnionT{
int x;
char y[2];
char z;
}a; |
union 宣告方式: |
union unionT c;
|
union unionT c;
UnionT d;
|
union unionT c;
UnionT d; |
union 使用方式: |
a.x=2;
a.y[0]="A";
a.y[1]="B";
a.z="b"; |
a.x=2;
a.y[0]="A";
a.y[1]="B";
a.z="b";
|
a.x=2;
a.y[0]="A";
a.y[1]="B";
a.z="b"; |
另一個與 struct 結合的範例:
typedef struct bitset{
unsigned int w:2;
unsigned int x:3;
unsigned int y:1;
unsigned int z:2;
}Bitset;
union unionType{
char p;
Bitset k;
}a;
int main(int argc, char *argv[]) {
a.p="\0";
a.p=(char) 118;
printf("a.k.w=%d , a.k.x=%d , a.k.y=%d , a.k.z=%d\n",a.k.w, a.k.x, a.k.y, a.k.z);
printf("size : a=%d\n",sizeof(a));
} |
|
|