8.8.1 ความหมายและลักษณะของข้อมูลแบบยูเนียน
ยูเนียน คือ ข้อมูลแบบหนึ่งที่สามารถกำหนดให้ตัวแปรต่างชนิดกัน ใช้เนื้อที่ในหน่วยความจำของเครื่องร่วมกันได้ ทำให้การใช้เนื้อที่ภายในหน่วยความจำลดลง
เช่น สมมติว่าเรามีตัวแปรอยู่ 3 ตัว คือตัวแปร a, b และ c ตามลำดับ โดยที่ตัวแปร a เป็นชนิด integer, ตัวแปร b เป็นชนิด floating point และตัวแปร c เป็นชนิด single character และเราต้องการให้ตัวแปร a, b และ c ใช้เนื้อที่ภายในหน่วยความจำร่วมกัน
เช่น สมมติว่าเรามีตัวแปรอยู่ 3 ตัว คือตัวแปร a, b และ c ตามลำดับ โดยที่ตัวแปร a เป็นชนิด integer, ตัวแปร b เป็นชนิด floating point และตัวแปร c เป็นชนิด single character และเราต้องการให้ตัวแปร a, b และ c ใช้เนื้อที่ภายในหน่วยความจำร่วมกัน
ลักษณะเช่นนี้ต้องใช้ข้อมูลแบบยูเนียนเพราะตัวแปรต่างชนิดกัน ใช้เนื้อที่ภายในหน่วยความจำร่วมกันได้โดยใช้คำสั่งดังนี้
union {
int a;
float b;
char c;
} ShareArea;
8.8.2 การประกาศข้อมูลแบบยูเนียน
(declaration of an unions data type)
สามารถทำได้โดยใช้คำสั่ง union มาช่วยในการประกาศข้อมูลแบบยูเนียน โดยมีรูปแบบการประกาศดังนี้
(declaration of an unions data type)
สามารถทำได้โดยใช้คำสั่ง union มาช่วยในการประกาศข้อมูลแบบยูเนียน โดยมีรูปแบบการประกาศดังนี้
รูปแบบที่ 1
union union_name
{
type1 name1;
type2 name2;
………
typeN nameN;
} union_var;
รูปแบบที่ 2
union union_name
{
type1 name1;
type2 name2;
………
typeN nameN;
};
union union_name union_var;
โดยที่
union เป็นคำสั่งที่ใช้ประกาศข้อมูลแบบยูเนียน
union_name เป็นชื่อข้อมูลแบบยูเนียน ใช้สำหรับการประกาศข้อมูลแบบยูเนียนกลุ่มอื่นให้มีโครงสร้างเหมือนกลุ่มยูเนียนที่เคยประกาศไว้แล้ว
union_var เป็นชื่อตัวแปรยูเนียนใช้สำหรับการอ้างอิงภายในยูเนียน
type1 name1, type2 name2,…, typeN nameN เป็นชนิดและชื่อตัวแปรตัวที่ 1, 2, 3, …, N ตามลำดับ บางครั้งอาจจะเรียก name1, name2,…, nameN ว่า element 1, element2, …, element N ตามลำดับ
ตัวอย่างที่ 8.6 แสดงการประกาศข้อมูลแบบยูเนียน
union same
{
int j;
char ch;
float a;
} one;
หรือใช้คำสั่ง
union same
{
int j;
char ch;
float a;
} ;
union same one;
เมื่อใช้คำสั่งประกาศข้อมูลแบบยูเนียนข้างต้น ภายในหน่วยความจำจะมีลักษณะการจองเนื้อที่ไว้ดังนี้
รูปที่ 8.5 แสดงการจองเนื้อที่ภายในหน่วยความจำของข้อมูลแบบยูเนียนชื่อ same
จากรูปข้างต้นจะเห็นได้ว่ามีการจองเนื้อที่ในหน่วยความจำมากที่สุดเพียง 4 bytes ซึ่งเพียงพอสำหรับตัวแปรชนิด float เนื่องจาก float ใช้เนื้อที่มากที่สุด 4 bytes ส่วน int ใช้ 2 bytes และ char ใช้ 1 bytes เมื่อใช้คำสั่ง union จะมีการจองเนื้อที่เพื่อให้ใช้หน่วยความจำร่วมกันได้โดยใช้หลักการจองเนื้อที่เท่ากับตัวแปรที่ใช้มากที่สุด ถึงแม้ว่าจะมีข้อมูลต่างชนิดกันก็ตาม
8.8.3 การอ้างอิงตัวแปรภายในข้อมูลแบบยูเนียน
(accessing union members)
การอ้างอิงสมาชิกหรือตัวแปรภายในข้อมูลแบบยูเนียน สามารถทำได้โดยเรียกชื่อตัวแปรยูเนียน (union_var) ตามด้วยเครื่องหมาย . (period) จากนั้นก็ตามด้วยชื่อตัวแปรภายในยูเนียน (element_name หรือ member_name) ซึ่งมีลักษณะการอ้างอิงทำนองเดียวกันกับข้อมูลแบบโครงสร้าง
(accessing union members)
การอ้างอิงสมาชิกหรือตัวแปรภายในข้อมูลแบบยูเนียน สามารถทำได้โดยเรียกชื่อตัวแปรยูเนียน (union_var) ตามด้วยเครื่องหมาย . (period) จากนั้นก็ตามด้วยชื่อตัวแปรภายในยูเนียน (element_name หรือ member_name) ซึ่งมีลักษณะการอ้างอิงทำนองเดียวกันกับข้อมูลแบบโครงสร้าง
รูปแบบการอ้างอิงตัวแปรภายในยูเนียน
union_var.member_name
เช่น จากตัวอย่างการประกาศยูเนียนที่ผ่านมา ถ้าต้องการอ้างอิงภายในยูเนียนสามารถ ทำได้ดังนี้
same.a หมายถึง ตัวแปร a ที่อยู่ในยูเนียน same
same.ch หมายถึง ตัวแปร ch ที่อยู่ในยูเนียน same
same.j หมายถึง ตัวแปร j ที่อยู่ในยูเนียน same
เพื่อความเข้าใจในการใช้ยูเนียนมากยิ่งขึ้น ให้ศึกษาจากโปรแกรมตัวอย่าง ดังต่อไปนี้
โปรแกรมตัวอย่างที่ 8.8 แสดงการใช้ยูเนียน
/* union1.c */ | ||||
ผลลัพธ์ที่ได้จากโปรแกรม
คำอธิบายโปรแกรม
จากโปรแกรมตัวอย่างข้างต้น เพื่อความเข้าใจเกี่ยวกับข้อมูลแบบ union มากขึ้น (ดูรูปที่ 8.6 ประกอบความเข้าใจ)
unsame เป็นตัวแปรยูเนียน
จากโปรแกรมตัวอย่างข้างต้น เพื่อความเข้าใจเกี่ยวกับข้อมูลแบบ union มากขึ้น (ดูรูปที่ 8.6 ประกอบความเข้าใจ)
unsame เป็นตัวแปรยูเนียน
รูปที่ 8.6 แสดงการจองเนื้อที่ในหน่วยความจำของข้อมูลแบบยูเนียนชื่อ intflo
โปรแกรมตัวอย่างที่ 8.9 แสดงการใช้ยูเนียน
/* union2.c */ | ||||
ผลลัพธ์ที่ได้จากโปรแกรม
8.8.4 ข้อควรระวังในการใช้ยูเนียน
การใช้เนื้อที่ร่วมกันของตัวแปรต่างชนิดกัน เมื่อใช้ตัวแปรใดแล้ว ควรพิมพ์ค่าตัวแปรนั้นออมาก่อนที่จะใช้ตัวแปรตัวอื่น เพราะข้อมูลเดิมจะหายไปเนื่องจากใช้เนื้อที่ร่วมกัน
0 ความคิดเห็น:
แสดงความคิดเห็น