प्रोग्रामिंग में फंक्शन में पैरामीटर पास करने के आधार पर हम फंक्शन इनवोकेशन को दो में वर्गीकृत करते हैं: कॉल बाय वैल्यू और कॉल बाय रेफरेंस। जैसा कि नाम से पता चलता है, दोनों इनवोकेशन में हम फंक्शन को पैरामीटर के प्रकार द्वारा कॉल कर रहे हैं - एक में हम पैरामीटर का वास्तविक मान पास करते हैं और दूसरे में हम पैरामीटर का स्थान/रेफरेंस पास करते हैं।
कॉल बाय वैल्यू और कॉल बाय रेफरेंस के बीच महत्वपूर्ण अंतर निम्नलिखित हैं।
| Sr. No. | Key | कॉल बाय वैल्यू | कॉल बाय रेफरेंस |
|---|---|---|---|
| 1 | नामकरण परंपरा | चूंकि इस प्रकार में फंक्शन इनवोकेशन के लिए पैरामीटर का मान पास किया जाता है इसलिए इसे कॉल बाय वैल्यू नाम दिया गया है। | दूसरी ओर इस प्रकार में फंक्शन को इनवोक करने के लिए पास किए गए पैरामीटर का रेफरेंस पास किया जाता है इसलिए इसे कॉल बाय रेफरेंस नाम दिया गया है। |
| 2 | आंतरिक कार्यान्वयन | कॉल बाय वैल्यू में फंक्शन कॉल करते समय पास किए गए पैरामीटर के मान फंक्शन के वास्तविक लोकल आर्गुमेंट में कॉपी हो जाते हैं। | कॉल बाय रेफरेंस में पास किए गए पैरामीटर का लोकेशन एड्रेस/रेफरेंस कॉपी होकर लोकल आर्गुमेंट को असाइन हो जाता है ताकि पास किया गया पैरामीटर और वास्तविक आर्गुमेंट दोनों एक ही लोकेशन को संदर्भित करें। |
| 3 | परिवर्तनों का प्रभाव | चूंकि पास किए गए पैरामीटर का मान फंक्शन के आर्गुमेंट में कॉपी हो जाता है इसलिए फंक्शन के अंदर आर्गुमेंट में किया गया कोई भी परिवर्तन पास किए गए पैरामीटर में प्रतिबिंबित नहीं होता। | चूंकि आर्गुमेंट और पास किया गया पैरामीटर दोनों एक ही लोकेशन को संदर्भित करते हैं इसलिए फंक्शन के अंदर आर्गुमेंट में किया गया कोई भी परिवर्तन पास किए गए पैरामीटर में प्रतिबिंबित होता है। |
| 4 | संदर्भित मेमोरी लोकेशन | पास किए गए पैरामीटर और फंक्शन के वास्तविक आर्गुमेंट दोनों द्वारा संदर्भित मेमोरी लोकेशन अलग होता है। | पास किए गए पैरामीटर और फंक्शन के वास्तविक आर्गुमेंट दोनों द्वारा संदर्भित मेमोरी लोकेशन समान होता है। |
| 5 | समर्थित भाषाएं | कॉल बाय वैल्यू C++, PHP, Visual Basic NET, और C# जैसी भाषाओं द्वारा समर्थित है। | कॉल बाय रेफरेंस मुख्य रूप से JAVA द्वारा समर्थित है। |
कॉल बाय वैल्यू बनाम कॉल बाय रेफरेंस का उदाहरण
ByValue.c
#include <stdio.h>
class ByValue{
void swapByValue(int, int); /* Prototype */
int main(){
int n1 = 10, n2 = 20;
swapByValue(n1, n2);
printf("n1: %d, n2: %d\n", n1, n2);
}
void swapByValue(int a, int b){
int t;
t = a; a = b; b = t;
}
}
आउटपुट
n1: 10, n2: 20
उदाहरण
ByReference.c
#include <stdio.h>
class ByReference{
void swapByReference(int*, int*);
int main(){
int n1 = 10, n2 = 20;
swapByReference(&n1, &n2);
printf("n1: %d, n2: %d\n", n1, n2);
}
void swapByReference(int *a, int *b){
int t;
t = *a; *a = *b; *b = t;
}
}
आउटपुट
n1: 20, n2: 10