अध्याय 12: स्ट्रक्चर्स और यूनियंस (Structures and Unions)

अध्याय 12: स्ट्रक्चर्स और यूनियंस (Structures and Unions)

C प्रोग्रामिंग में, स्ट्रक्चर्स और यूनियंस उपयोगकर्ता द्वारा परिभाषित डेटा प्रकार हैं जो विभिन्न प्रकार के डेटा तत्वों को एक इकाई के रूप में संग्रहीत करने की अनुमति देते हैं। स्ट्रक्चर्स का उपयोग संबंधित डेटा तत्वों को समूहित करने के लिए किया जाता है, जिससे डेटा को अधिक व्यवस्थित और प्रबंधनीय बनाया जा सके। यूनियंस भी डेटा तत्वों को समूहित करते हैं, लेकिन वे सभी तत्वों को एक ही मेमोरी स्थान पर संग्रहीत करते हैं, जिससे मेमोरी की बचत होती है। इस अध्याय में, हम स्ट्रक्चर्स और यूनियंस के उपयोग, उनकी घोषणा, प्रारंभिककरण, और उनके साथ किए जाने वाले विभिन्न ऑपरेशन्स के बारे में जानेंगे।

स्ट्रक्चर्स का परिचय (Introduction to Structures)

स्ट्रक्चर्स C प्रोग्रामिंग भाषा में एक उपयोगकर्ता द्वारा परिभाषित डेटा प्रकार है जो विभिन्न प्रकार के डेटा तत्वों को एक साथ समूहित करने की अनुमति देता है। स्ट्रक्चर का उपयोग करके, हम संबंधित डेटा तत्वों को एक ही नाम के तहत संग्रहीत कर सकते हैं, जिससे डेटा को प्रबंधित और संगठित करना आसान हो जाता है। स्ट्रक्चर्स का उपयोग तब किया जाता है जब हमें विभिन्न प्रकार के डेटा तत्वों को एक साथ समूहित करने की आवश्यकता होती है, जैसे कि एक छात्र का नाम, आयु, और ग्रेड।

स्ट्रक्चर की घोषणा (Structure Declaration)

स्ट्रक्चर को परिभाषित करने के लिए struct कीवर्ड का उपयोग किया जाता है। स्ट्रक्चर की घोषणा में स्ट्रक्चर का नाम और इसके सदस्यों की सूची शामिल होती है। प्रत्येक सदस्य का अपना डेटा प्रकार होता है।

सिंटैक्स:

struct structure_name {
    data_type member1;
    data_type member2;
    ...
};

उदाहरण:

#include <stdio.h>

// स्ट्रक्चर की घोषणा
struct Student {
    char name[50];
    int age;
    float grade;
};

int main() {
    // स्ट्रक्चर वेरिएबल की घोषणा
    struct Student student1;

    // स्ट्रक्चर वेरिएबल के सदस्यों को असाइन करना
    strcpy(student1.name, "John Doe");
    student1.age = 20;
    student1.grade = 85.5;

    // स्ट्रक्चर वेरिएबल के सदस्यों को प्रिंट करना
    printf("Name: %s\n", student1.name);
    printf("Age: %d\n", student1.age);
    printf("Grade: %.2f\n", student1.grade);

    return 0;
}

स्ट्रक्चर वेरिएबल की घोषणा (Declaring Structure Variables)

स्ट्रक्चर वेरिएबल की घोषणा करने के लिए struct कीवर्ड का उपयोग किया जाता है, उसके बाद स्ट्रक्चर का नाम और फिर वेरिएबल का नाम दिया जाता है।

उदाहरण:

struct Student student1, student2;

स्ट्रक्चर वेरिएबल का प्रारंभिककरण (Initializing Structure Variables)

स्ट्रक्चर वेरिएबल को घोषित करने के बाद, हम उसके सदस्यों को विभिन्न मान असाइन कर सकते हैं। यह प्रक्रिया उसी प्रकार होती है जैसे सामान्य वेरिएबल्स के साथ होती है।

उदाहरण:

student1.age = 20;
strcpy(student1.name, "John Doe");
student1.grade = 85.5;

स्ट्रक्चर के सदस्यों को एक्सेस करना (Accessing Structure Members)

स्ट्रक्चर के सदस्यों को एक्सेस करने के लिए डॉट (.) ऑपरेटर का उपयोग किया जाता है। डॉट ऑपरेटर का उपयोग स्ट्रक्चर वेरिएबल के नाम के बाद किया जाता है।

उदाहरण:

printf("Name: %s\n", student1.name);
printf("Age: %d\n", student1.age);
printf("Grade: %.2f\n", student1.grade);

इस खंड में, हमने स्ट्रक्चर्स का परिचय प्राप्त किया। हमने सीखा कि स्ट्रक्चर को कैसे परिभाषित, घोषित, और प्रारंभिक किया जाता है, और कैसे स्ट्रक्चर के सदस्यों को एक्सेस और असाइन किया जाता है। स्ट्रक्चर्स का उपयोग डेटा को अधिक व्यवस्थित और प्रबंधनीय बनाने में मदद करता है। अगले खंड में, हम यूनियंस के बारे में जानेंगे और उनका उपयोग कैसे किया जाता है, यह सीखेंगे।

स्ट्रक्चर्स के साथ ऑपरेशन्स (Operations with Structures)

स्ट्रक्चर्स C प्रोग्रामिंग में विभिन्न प्रकार के डेटा तत्वों को एक इकाई के रूप में संग्रहीत और प्रबंधित करने की अनुमति देते हैं। स्ट्रक्चर्स के साथ विभिन्न प्रकार के ऑपरेशन्स किए जा सकते हैं, जैसे कि स्ट्रक्चर वेरिएबल्स का असाइनमेंट, फ़ंक्शन्स में स्ट्रक्चर्स को पास करना, और स्ट्रक्चर वेरिएबल्स की तुलना करना। इस खंड में, हम स्ट्रक्चर्स के साथ इन सामान्य ऑपरेशन्स को विस्तार से समझेंगे।

स्ट्रक्चर वेरिएबल्स का असाइनमेंट (Assignment of Structure Variables)

स्ट्रक्चर वेरिएबल्स को एक दूसरे को असाइन किया जा सकता है, बशर्ते कि वे एक ही स्ट्रक्चर प्रकार के हों।

उदाहरण:

#include <stdio.h>
#include <string.h>

struct Student {
    char name[50];
    int age;
    float grade;
};

int main() {
    struct Student student1, student2;

    // student1 के सदस्यों को असाइन करना
    strcpy(student1.name, "John Doe");
    student1.age = 20;
    student1.grade = 85.5;

    // student1 को student2 को असाइन करना
    student2 = student1;

    // student2 के सदस्यों को प्रिंट करना
    printf("Name: %s\n", student2.name);
    printf("Age: %d\n", student2.age);
    printf("Grade: %.2f\n", student2.grade);

    return 0;
}

फ़ंक्शन्स में स्ट्रक्चर्स को पास करना (Passing Structures to Functions)

स्ट्रक्चर्स को फ़ंक्शन्स में दो तरीकों से पास किया जा सकता है: पास-बाय-वैल्यू और पास-बाय-रेफरेंस। पास-बाय-वैल्यू में स्ट्रक्चर की एक कॉपी फ़ंक्शन में पास की जाती है, जबकि पास-बाय-रेफरेंस में स्ट्रक्चर का मेमोरी एड्रेस पास किया जाता है।

पास-बाय-वैल्यू:

#include <stdio.h>

struct Student {
    char name[50];
    int age;
    float grade;
};

// पास-बाय-वैल्यू के रूप में स्ट्रक्चर पास करना
void printStudent(struct Student s) {
printf("Name: %s\n", s.name);
    printf("Age: %d\n", s.age);
    printf("Grade: %.2f\n", s.grade);
}

int main() {
    struct Student student1;

    // student1 के सदस्यों को असाइन करना
    strcpy(student1.name, "John Doe");
    student1.age = 20;
    student1.grade = 85.5;

    // फ़ंक्शन को कॉल करना
    printStudent(student1);

    return 0;
}

पास-बाय-रेफरेंस:

#include <stdio.h>

struct Student {
    char name[50];
    int age;
    float grade;
};

// पास-बाय-रेफरेंस के रूप में स्ट्रक्चर पास करना
void printStudent(struct Student *s) {
    printf("Name: %s\n", s->name);
    printf("Age: %d\n", s->age);
    printf("Grade: %.2f\n", s->grade);
}

int main() {
    struct Student student1;

    // student1 के सदस्यों को असाइन करना
    strcpy(student1.name, "John Doe");
    student1.age = 20;
    student1.grade = 85.5;

    // फ़ंक्शन को कॉल करना
    printStudent(&student1);

    return 0;
}

स्ट्रक्चर वेरिएबल्स की तुलना (Comparison of Structure Variables)

C में, स्ट्रक्चर वेरिएबल्स को सीधे तुलना नहीं किया जा सकता है। इसके लिए हमें उनके सदस्यों को अलग-अलग तुलना करना होता है।

उदाहरण:

#include <stdio.h>
#include <string.h>

struct Student {
    char name[50];
    int age;
    float grade;
};

// स्ट्रक्चर वेरिएबल्स की तुलना करना
int compareStudents(struct Student s1, struct Student s2) {
    if (strcmp(s1.name, s2.name) == 0 && s1.age == s2.age && s1.grade == s2.grade) {
        return 1; // बराबर हैं
    } else {
        return 0; // बराबर नहीं हैं
    }
}

int main() {
    struct Student student1, student2;

    // student1 के सदस्यों को असाइन करना
    strcpy(student1.name, "John Doe");
    student1.age = 20;
    student1.grade = 85.5;

    // student2 के सदस्यों को असाइन करना
    strcpy(student2.name, "John Doe");
    student2.age = 20;
    student2.grade = 85.5;

    // स्ट्रक्चर वेरिएबल्स की तुलना करना
    if (compareStudents(student1, student2)) {
        printf("Students are equal.\n");
    } else {
        printf("Students are not equal.\n");
    }

    return 0;
}

इस खंड में, हमने स्ट्रक्चर्स के साथ विभिन्न ऑपरेशन्स के बारे में सीखा। हमने देखा कि स्ट्रक्चर वेरिएबल्स को एक-दूसरे को कैसे असाइन किया जा सकता है, फ़ंक्शन्स में स्ट्रक्चर्स को कैसे पास किया जा सकता है (पास-बाय-वैल्यू और पास-बाय-रेफरेंस), और स्ट्रक्चर वेरिएबल्स की तुलना कैसे की जा सकती है। स्ट्रक्चर्स के साथ काम करने से हमारा प्रोग्राम अधिक संगठित और प्रबंधनीय बनता है। अगले खंड में, हम यूनियंस के बारे में जानेंगे और उनका उपयोग कैसे किया जाता है, यह सीखेंगे।

यूनियंस का परिचय (Introduction to Unions)

यूनियंस C प्रोग्रामिंग में एक उपयोगकर्ता द्वारा परिभाषित डेटा प्रकार है, जो विभिन्न प्रकार के डेटा तत्वों को एक ही मेमोरी स्थान पर संग्रहीत करने की अनुमति देता है। इसका मतलब है कि यूनियंस में सभी सदस्यों को एक ही मेमोरी स्थान साझा करना पड़ता है, और किसी भी समय केवल एक ही सदस्य का मान संग्रहीत किया जा सकता है। यूनियंस का उपयोग मेमोरी की बचत के लिए किया जाता है, विशेष रूप से तब जब हमें एक ही समय में केवल एक डेटा प्रकार की आवश्यकता होती है।

यूनियंस की घोषणा (Union Declaration)

यूनियंस को परिभाषित करने के लिए union कीवर्ड का उपयोग किया जाता है। यूनियन की घोषणा में यूनियन का नाम और इसके सदस्यों की सूची शामिल होती है। प्रत्येक सदस्य का अपना डेटा प्रकार होता है, लेकिन सभी सदस्य एक ही मेमोरी स्थान साझा करते हैं।

सिंटैक्स:

union union_name {
    data_type member1;
    data_type member2;
    ...
};

उदाहरण:

#include <stdio.h>

// यूनियन की घोषणा
union Data {
    int intValue;
    float floatValue;
    char charValue;
};

int main() {
    union Data data;

    // यूनियन के सदस्यों को असाइन करना और प्रिंट करना
    data.intValue = 10;
    printf("intValue: %d\n", data.intValue);

    data.floatValue = 220.5;
    printf("floatValue: %.2f\n", data.floatValue);

    data.charValue = 'A';
    printf("charValue: %c\n", data.charValue);

    return 0;
}

यूनियंस का उपयोग (Usage of Unions)
यूनियंस का उपयोग तब किया जाता है जब हमें एक ही मेमोरी स्थान पर विभिन्न प्रकार के डेटा संग्रहीत करने की आवश्यकता होती है। यह मेमोरी की बचत करता है और प्रोग्राम को अधिक कुशल बनाता है। हालांकि, हमें ध्यान रखना चाहिए कि यूनियन के किसी एक सदस्य को संशोधित करने से अन्य सभी सदस्यों का मान प्रभावित हो सकता है, क्योंकि वे सभी एक ही मेमोरी स्थान साझा करते हैं।

इस खंड में, हमने यूनियंस का परिचय प्राप्त किया। हमने सीखा कि यूनियंस को कैसे परिभाषित, घोषित, और उपयोग किया जाता है। यूनियंस का सही उपयोग प्रोग्राम की मेमोरी दक्षता को बढ़ाता है। अगले खंड में, हम यूनियंस के साथ विभिन्न ऑपरेशन्स के बारे में जानेंगे और उनके उपयोग के तरीके को समझेंगे।



Index