Union คืออะไร?
Union คือพื้นที่หน่วยความจำที่ **แชร์ (Shared)** ระหว่างตัวแปรหลายตัวที่มีชนิดข้อมูลต่างกัน ในเวลาเดียวกัน จะมีค่าได้เพียง **หนึ่งสมาชิก (member)** เท่านั้น
ไวยากรณ์ Union
union union_tag {
datatype member1;
datatype member2;
// ...
datatype memberN;
};
ตัวอย่างการประกาศ
union sample {
int a;
float b;
char c;
};
// 3 วิธีประกาศตัวแปร Union
union sample { int a; float b; char c; } s; // วิธี 1
union { int a; float b; char c; } s; // วิธี 2 (Anonymous)
union sample { int a; float b; char c; }; union sample s; // วิธี 3
คุณสมบัติสำคัญ
- ขนาดของ Union = ขนาดของ **สมาชิกที่ใหญ่ที่สุด**
- ในเวลาเดียวกัน **เข้าถึงได้เพียง 1 สมาชิก** (เขียนทับกัน)
- เข้าถึงสมาชิกด้วย
.(ตัวแปร) หรือ->(pointer) - ไม่มีข้อจำกัดชนิดข้อมูลใน Union
ตัวอย่าง: Union กับ Pointer
#include <stdio.h>
union abc {
int a;
char b;
};
int main() {
union abc var;
var.a = 90; // เขียนค่า int
union abc *p = &var; // Pointer ชี้ไปที่ union
// อ่านผ่าน pointer: a=90, b=byte แรกของ 90 (ASCII 'Z' = 90)
printf("%d%c", p->a, p->b);
return 0;
}
ผลลัพธ์:
90Z
คำอธิบายผลลัพธ์
var.a = 90เก็บค่า 90 (0x0000005A ใน little-endian)p->aอ่านเป็น int ได้ 90p->bอ่าน byte แรก (LSB) ได้ 0x5A = 90 = ASCII 'Z'- เพราะ Union แชร์หน่วยความจำเดียวกัน การอ่านสมาชิกต่างกันจะได้ค่าต่างกัน
Struct vs Union
| คุณสมบัติ | Struct | Union |
|---|---|---|
| หน่วยความจำ | รวมขนาดทุกสมาชิก | ขนาดสมาชิกที่ใหญ่ที่สุด |
| การเข้าถึง | เข้าถึงทุกตัวพร้อมกันได้ | เข้าถึงได้ทีละตัว |
| การใช้งาน | ข้อมูลที่เกี่ยวข้องทั้งหมด | เลือกใช้ 1 ในหลายรูปแบบ |