ความหมายของ Union
Union เป็นตำแหน่งหน่วยความจำที่ใช้ร่วมกันโดยตัวแปรหลายตัวที่มีชนิดข้อมูลต่างกัน คอมไพเลอร์จะจัดสรรหน่วยความจำเท่ากับขนาดของสมาชิกที่ใหญ่ที่สุด
ไวยากรณ์
union uniontag {
datatype member1;
datatype member2;
// ...
datatype memberN;
};วิธีการประกาศตัวแปร Union (3 รูปแบบ)
รูปแบบที่ 1: ประกาศพร้อมกำหนดชื่อตัวแปร
union sample {
int a;
float b;
char c;
} s;รูปแบบที่ 2: ไม่มี tag name (anonymous union)
union {
int a;
float b;
char c;
} s;รูปแบบที่ 3: แยกการประกาศ tag และตัวแปร
union sample {
int a;
float b;
char c;
};
union sample s;คุณสมบัติสำคัญ
- คอมไพเลอร์จัดสรรหน่วยความจำเท่ากับขนาดสมาชิกที่ใหญ่ที่สุด
- ในเวลาเดียวกัน อ้างอิงได้เพียงสมาชิกเดียว
- การเข้าถึงสมาชิกใช้ dot operator (.) สำหรับตัวแปรปกติ และ arrow operator (->) สำหรับ pointer
ตัวอย่างโปรแกรมที่ 1: การ Initialize และเข้าถึง Union
#include <stdio.h>
union sample {
int a;
float b;
char c;
};
int main() {
union sample s = {10, 20.5, 'A'};
printf("a=%d\\n", s.a);
printf("b=%f\\n", s.b);
printf("c=%c\\n", s.c);
return 0;
}ผลลัพธ์
a = garbage value b = garbage value c = A
คำอธิบาย: เพราะ union ใช้หน่วยความจำร่วมกัน การกำหนดค่า {10, 20.5, 'A'} จะทำให้มีค่าเพียงตัวสุดท้าย ('A') ที่ถูกต้อง ส่วน a และ b จะได้ค่า garbage
Union ของ Structures (Union ภายใน Structure)
สามารถวาง structure ไว้ภายใน union ได้ เรียกว่า "Union of Structures"
ตัวอย่างโปรแกรมที่ 2: Union ภายใน Structure
#include <stdio.h>
struct x {
int a;
float b;
};
union z {
struct x s;
};
int main() {
union z u;
u.s.a = 10;
u.s.b = 30.5;
printf("a=%d\\n", u.s.a);
printf("b=%f\\n", u.s.b);
return 0;
}ผลลัพธ์
a= 10 b = 30.5
คำอธิบาย: ในกรณีนี้ union มีเพียงสมาชิกเดียวคือ structure x จึงสามารถเข้าถึงทั้ง a และ b ได้พร้อมกัน เพราะ structure จัดสรรหน่วยความจำแยกต่างหาก