पास बाय वैल्यू (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.member | s->member |
| कॉपी बनती है | हाँ | नहीं |
| मूल बदल सकता है | नहीं | हाँ |
| बड़ी स्ट्रक्चर के लिए | खराब | अच्छा |
| छोटी स्ट्रक्चर के लिए | ठीक | थोड़ा ओवरहेड |
कब क्या उपयोग करें?
- मान द्वारा: छोटी स्ट्रक्चर (≤16 बाइट्स), केवल पढ़ना, थ्रेड-सुरक्षा चाहिए।
- पॉइंटर द्वारा: बड़ी स्ट्रक्चर, संशोधन करना, प्रदर्शन महत्वपूर्ण, NULL पास करने की संभावना।
- Const पॉइंटर:
void f(const Struct *s)- संशोधन रोके, कॉपी बचाए, NULL संभव।
C99: कंपाउंड लिटरल्स के साथ पास करना
show((struct Add){10, 20}); // अस्थायी स्ट्रक्चर बनाकर पास
// केवल पढ़ने वाले फंक्शन के लिए उपयोगी