यूनियन (Union) क्या है?
यूनियन एक यूजर-डिफाइंड डेटा प्रकार है जो एक ही मेमोरी स्थान को विभिन्न डेटा प्रकारों के सदस्यों के लिए साझा करने की अनुमति देता है। किसी भी समय केवल एक सदस्य ही मान रख सकता है।
यूनियन की घोषणा
union यूनियन_नाम {
डेटा_प्रकार सदस्य1;
डेटा_प्रकार सदस्य2;
// ...
};
उदाहरण:
union Sample {
int a;
float b;
char c;
};
आकार (Size)
यूनियन का आकार उसके सबसे बड़े सदस्य के आकार के बराबर होता है (पैडिंग सहित)।
union Sample { int a; float b; char c; };
// मान लें: int=4, float=4, char=1
// आकार = max(4,4,1) = 4 बाइट्स (या अलाइनमेंट के अनुसार 8/12)
यूनियन पॉइंटर (Union Pointer)
यूनियन चर का पता रखने वाला पॉइंटर। सदस्य एक्सेस के लिए -> (ऐरो ऑपरेटर) उपयोग करें।
सिंटैक्स
union Sample var;
union Sample *ptr = &var;
// एक्सेस
ptr->a = 10;
ptr->b = 3.14;
उदाहरण प्रोग्राम
#include <stdio.h>
union abc {
int a;
char b;
};
int main() {
union abc var;
var.a = 90; // 90 = 0x0000005A (little-endian: 5A 00 00 00)
union abc *p = &var;
// p->a और p->b समान मेमोरी साझा करते हैं
printf("p->a = %d\n", p->a); // 90
printf("p->b = %c\n", p->b); // 'Z' (ASCII 90)
printf("पता: %p\n", (void*)p);
// दूसरा सदस्य बदलने पर पहला प्रभावित होता है
p->b = 'A'; // 65
printf("p->b बदलने के बाद p->a = %d\n", p->a); // 65
return 0;
}
आउटपुट
p->a = 90 p->b = Z पता: 0x7ffee3b8c9ac p->b बदलने के बाद p->a = 65
यूनियन vs संरचना (Struct)
| विशेषता | Struct | Union |
|---|---|---|
| मेमोरी | सभी सदस्यों का योग (+पैडिंग) | सबसे बड़ा सदस्य |
| सक्रिय सदस्य | सभी एक साथ | एक समय में एक |
| उपयोग | संबंधित डेटा समूह | मेमोरी बचाना, प्रकार-पनिंग |
| प्रारंभिकरण | सभी सदस्य | केवल पहला सदस्य (C99: डेजिग्नेटेड) |
व्यावहारिक उपयोग: प्रकार-पनिंग (Type Punning)
union FloatInt {
float f;
int i;
};
void printFloatBits(float x) {
union FloatInt u;
u.f = x;
printf("फ्लोट: %f, बिट्स: 0x%08X\n", u.f, u.i);
}
सावधानियाँ
- एक सदस्य लिखकर दूसरे को पढ़ना इम्प्लीमेंटेशन-डिफाइंड व्यवहार है (आमतौर पर काम करता है लेकिन पोर्टेबल नहीं)।
- C11 से
_Alignasऔरstdalign.hअलाइनमेंट नियंत्रण के लिए। - एनोनिमस यूनियन (C11) संरचना के अंदर सीधे सदस्य एक्सेस देते हैं।