Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> सी प्रोग्रामिंग

C भाषा में पूरी स्ट्रक्चर को फंक्शन में आर्गुमेंट के रूप में पास करना


पास बाय वैल्यू (Pass by Value)

जब पूरी स्ट्रक्चर को फंक्शन में पास किया जाता है, तो उसकी एक प्रति (copy) बनती है। मूल स्ट्रक्चर अपरिवर्तित रहती है।

सिंटैक्स


// फंक्शन घोषणा
void display(struct Student s);  // मान द्वारा

// कॉल
struct Student s1 = {1, "Amit", 85.5};
display(s1);  // कॉपी पास होती है

नुकसान

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

उदाहरण प्रोग्राम

#include <stdio.h>

struct Add {
    int var1;
    int var2;
};

// पूरी स्ट्रक्चर मान द्वारा प्राप्त
void show(struct Add a) {
    int sum = a.var1 + a.var2;
    printf("जोड़: %d\n", sum);
    
    // यह बदलाव मूल पर असर नहीं डालेगा
    a.var1 = 999;
    printf("फंक्शन के अंदर var1: %d\n", a.var1);
}

int main() {
    struct Add a;
    
    printf("var1 दर्ज करें: ");
    scanf("%d", &a.var1);
    printf("var2 दर्ज करें: ");
    scanf("%d", &a.var2);
    
    printf("कॉल से पहले main में var1: %d\n", a.var1);
    show(a);
    printf("कॉल के बाद main में var1: %d\n", a.var1);  // अपरिवर्तित
    
    return 0;
}

आउटपुट

var1 दर्ज करें: 30
var2 दर्ज करें: 40
कॉल से पहले main में var1: 30
जोड़: 70
फंक्शन के अंदर var1: 999
कॉल के बाद main में var1: 30  ← अपरिवर्तित!

बेहतर विकल्प: पॉइंटर द्वारा पास करें (Pass by Reference)


// फंक्शन घोषणा
void showPtr(struct Add *a);  // पॉइंटर द्वारा

// कॉल
showPtr(&a);  // पता पास करें

// फंक्शन परिभाषा
void showPtr(struct Add *a) {
    int sum = a->var1 + a->var2;  // -> ऑपरेटर
    printf("जोड़: %d\n", sum);
    a->var1 = 999;  // मूल बदल जाएगा
}

तुलना

पहलूमान द्वारा (Pass by Value)पॉइंटर द्वारा (Pass by Reference)
सिंटैक्सvoid f(Struct s)void f(Struct *s)
कॉलf(s)f(&s)
एक्सेसs.members->member
कॉपी बनती हैहाँनहीं
मूल बदल सकता हैनहींहाँ
बड़ी स्ट्रक्चर के लिएखराबअच्छा
छोटी स्ट्रक्चर के लिएठीकथोड़ा ओवरहेड

कब क्या उपयोग करें?

  • मान द्वारा: छोटी स्ट्रक्चर (≤16 बाइट्स), केवल पढ़ना, थ्रेड-सुरक्षा चाहिए।
  • पॉइंटर द्वारा: बड़ी स्ट्रक्चर, संशोधन करना, प्रदर्शन महत्वपूर्ण, NULL पास करने की संभावना।
  • Const पॉइंटर: void f(const Struct *s) - संशोधन रोके, कॉपी बचाए, NULL संभव।

C99: कंपाउंड लिटरल्स के साथ पास करना


show((struct Add){10, 20});  // अस्थायी स्ट्रक्चर बनाकर पास
// केवल पढ़ने वाले फंक्शन के लिए उपयोगी
  1. - पायथन में एक्सेप्शन को आर्गुमेंट कैसे पास करें?

    एक एक्सेप्शन का एक आर्गुमेंट हो सकता है, जो एक वैल्यू है जो समस्या के बारे में अतिरिक्त जानकारी देता है। आर्गुमेंट की सामग्री एक्सेप्शन से एक्सेप्शन में भिन्न होती है। आप except क्लॉज में एक वेरिएबल सप्लाई करके एक्सेप्शन के आर्गुमेंट को कैप्चर करते हैं जैसा कि नीचे दिखाया गया है: उदाहरण try: b =

  1. - पायथन फंक्शन में डिक्शनरी को आर्गुमेंट के रूप में कैसे पास करें?

    नीचे दिए गए कोड में हम दी गई डिक्शनरी को पायथन फंक्शन में आर्गुमेंट के रूप में पास करते हैं और फिर फंक्शन को कॉल करते हैं जो की/वैल्यू पेयर्स पर काम करता है और तदनुसार परिणाम देता है। उदाहरण d = {a : 1, b : 2, c : 3} def f(dict): for k, v in dict.iteritems(): print k, 2*v f(d) आउटपुट a 2

  1. - पायथन फंक्शन को फंक्शन आर्गुमेंट के रूप में कैसे पास करें?

    पायथन निम्न मेथड को लागू करता है जहां पहला पैरामीटर एक फंक्शन होता है: map(function, iterable, ...) - इटरेबल के प्रत्येक आइटम पर फंक्शन लागू करें और परिणामों की सूची लौटाएं। हम कस्टम फंक्शन्स भी लिख सकते हैं जहां हम फंक्शन को आर्गुमेंट के रूप में पास कर सकते हैं। दिए गए कोड को map मेथड का उपयोग करके