聯合 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));
}