किसी फ़ंक्शन के लिए पैरामीटर पास करने के आधार पर प्रोग्रामिंग में हमने फ़ंक्शन आमंत्रण को दो में वर्गीकृत किया:मूल्य द्वारा कॉल और संदर्भ द्वारा कॉल। जैसा कि नाम से पता चलता है कि दोनों आमंत्रणों में हम पैरामीटर के प्रकार से फ़ंक्शन को कॉल कर रहे हैं, हम पैरामीटर के वास्तविक मान को पास कर रहे हैं और दूसरे में हम पैरामीटर के स्थान/संदर्भ को पारित कर रहे हैं।
कॉल बाय वैल्यू और कॉल बाय रेफरेंस के बीच महत्वपूर्ण अंतर निम्नलिखित हैं।
<टेबल> <थेड> सीनियर। नहीं. | <वें शैली="पाठ्य-संरेखण:केंद्र;">कुंजीवें> मान के अनुसार कॉल करें | संदर्भ द्वारा कॉल करें |
थड> 1 | नामकरण कन्वेंशन | इस प्रकार के रूप में पैरामीटर का मान फ़ंक्शन आमंत्रण के लिए पास हो जाता है इसलिए इसे कॉल बाय वैल्यू नाम दिया गया है। | दूसरी ओर इस प्रकार में फ़ंक्शन को लागू करने के लिए पैरामीटर का संदर्भ पास किया जाता है, इसलिए इसे कॉल बाय रेफरेंस नाम दिया गया है। |
2 | आंतरिक कार्यान्वयन | कॉल बाय वैल्यू में फ़ंक्शन को कॉल करने के दौरान हमने जो पैरामीटर पारित किया है, उसे फ़ंक्शन के वास्तविक स्थानीय तर्क में कॉपी किया जाता है। | संदर्भ द्वारा कॉल में पारित पैरामीटर का स्थान पता/संदर्भ कॉपी किया जाता है और फ़ंक्शन के स्थानीय तर्क को सौंपा जाता है, इसलिए पारित पैरामीटर और वास्तविक तर्क दोनों एक ही स्थान को संदर्भित करते हैं। |
3 | परिवर्तनों के प्रभाव | चूंकि पारित पैरामीटर का मान फ़ंक्शन के तर्क में कॉपी किया जाता है, इसलिए फ़ंक्शन के अंदर तर्क में किया गया कोई भी परिवर्तन पारित पैरामीटर में प्रतिबिंबित नहीं होता है। | चूंकि तर्क और पारित पैरामीटर दोनों एक ही स्थान को संदर्भित करते हैं इसलिए फ़ंक्शन के अंदर तर्क में किया गया कोई भी परिवर्तन पारित पैरामीटर में परिलक्षित होता है। |
4 | संदर्भित स्मृति स्थान | स्मृति स्थान संदर्भित पैरामीटर और फ़ंक्शन के वास्तविक तर्क दोनों अलग हैं। | पारित पैरामीटर और फ़ंक्शन के वास्तविक तर्क दोनों द्वारा संदर्भित मेमोरी स्थान समान है। |
5 | समर्थित भाषाएं। | कॉल बाय वैल्यू को भाषाओं द्वारा समर्थित किया जाता है जैसे:C++.PHP। विजुअल बेसिक नेट, और सी#। | संदर्भ द्वारा कॉल प्राथमिक रूप से जावा द्वारा समर्थित है। |
मान द्वारा कॉल बनाम संदर्भ द्वारा कॉल का उदाहरण
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