कॉल बाय वैल्यू और कॉल बाय रेफरेंस के बीच अंतर

कॉल बाय वैल्यू और कॉल बाय रेफरेंस के बीच मुख्य अंतर

  • कॉल बाय वैल्यू विधि में मूल मान को संशोधित नहीं किया जाता है, जबकि कॉल बाय रेफरेंस विधि में मूल मान को संशोधित किया जाता है।
  • कॉल बाय वैल्यू में, वेरिएबल की एक प्रतिलिपि पास की जाती है, जबकि कॉल बाय रेफरेंस में, वेरिएबल को ही पास किया जाता है।
  • कॉल बाय वैल्यू में, वास्तविक और औपचारिक तर्क अलग-अलग मेमोरी स्थानों में बनाए जाएंगे, जबकि कॉल बाय रेफरेंस में, वास्तविक और औपचारिक तर्क एक ही मेमोरी स्थान में बनाए जाएंगे।
  • कॉल बाय वैल्यू प्रोग्रामिंग भाषाओं में डिफ़ॉल्ट विधि है जैसे C++, PHP, विज़ुअल बेसिक NET और C#, जबकि कॉल बाय रेफरेंस केवल इनमें समर्थित है Java भाषा।
  • कॉल बाय वैल्यू वेरिएबल्स को एक सीधी विधि का उपयोग करके पास किया जाता है, जबकि कॉल बाय रेफरेंस पॉइंटर्स वेरिएबल्स के पते को संग्रहीत करने के लिए आवश्यक होते हैं।

कॉल बाय वैल्यू और कॉल बाय रेफरेंस के बीच अंतर

प्रोग्रामिंग भाषाओं में, फ़ंक्शन को दो तरीकों से बुलाया जा सकता है: जिसे कॉल बाय वैल्यू और कॉल बाय रेफरेंस के रूप में जाना जाता है।

कॉल बाय वैल्यू विधि क्या है?

कॉल बाय वैल्यू विधि किसी तर्क के मान को उस फ़ंक्शन के औपचारिक पैरामीटर में कॉपी करती है। इसलिए, मुख्य फ़ंक्शन के पैरामीटर में किए गए परिवर्तन तर्क को प्रभावित नहीं करते हैं।

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

कॉल बाय रेफरेंस विधि क्या है?

कॉल बाय रेफरेंस विधि किसी तर्क के पते को औपचारिक पैरामीटर में कॉपी करती है। इस विधि में, पते का उपयोग फ़ंक्शन कॉल में उपयोग किए गए वास्तविक तर्क तक पहुँचने के लिए किया जाता है। इसका मतलब है कि पैरामीटर में किए गए परिवर्तन पासिंग तर्क को बदल देते हैं।

इस विधि में, मेमोरी आवंटन वास्तविक पैरामीटर के समान ही होता है। फ़ंक्शन में सभी ऑपरेशन वास्तविक पैरामीटर के पते पर संग्रहीत मान पर किए जाते हैं, और संशोधित मान उसी पते पर संग्रहीत किया जाएगा।

कॉल बाय वैल्यू विधि का C कोड उदाहरण

void main() {
        int a = 10,
        void increment(int);
        Cout << "before function calling" << a;
        increment(a);
        Cout << "after function calling" << a;
        getch();

        void increment(int x) {
            int x = x + 1;
            Cout << "value is" << x;
        }

आउटपुट:

before function calling 10
value is 11
after function calling 1-0

क्योंकि main() में घोषित वेरिएबल 'a' increment() में वेरिएबल 'x' से अलग है। इस प्रोग्राम में केवल वेरिएबल के नाम समान हैं, लेकिन उनके मेमोरी एड्रेस अलग-अलग हैं और अलग-अलग मेमोरी लोकेशन में स्टोर किए गए हैं।

Java कॉल बाय रेफरेंस विधि का कोड उदाहरण

Public static void main(string args[]) {
    int a = 10;
    System.out.println("Before call Value of a = ", a);
    Void increment();
    System.out.println("After call Value of a = ", a);
}

Void increment(int x) {
    int x = x + 1;
}

आउटपुट:

Before call Value of a =10
After call Value of a =11

क्योंकि 'a' में घोषित चर main() में चर 'a' को संदर्भित/इंगित कर रहा है। यहाँ चर का नाम अलग है, लेकिन दोनों एक ही मेमोरी एड्रेस लोकेशन को इंगित/संदर्भित कर रहे हैं।

मूल्य द्वारा कॉल बनाम संदर्भ द्वारा कॉल

पैरामीटर्स मूल्य से बुलाओ संदर्भ से कॉल करें
परिभाषा किसी फ़ंक्शन को कॉल करते समय, जब आप वेरिएबल्स को कॉपी करके मान पास करते हैं, तो इसे "कॉल बाय वैल्यूज़" के रूप में जाना जाता है। किसी फ़ंक्शन को कॉल करते समय, प्रोग्रामिंग भाषा में चर के मानों की प्रतिलिपि बनाने के बजाय, चर के पते का उपयोग किया जाता है, इसे "कॉल बाय रेफरेंस" के रूप में जाना जाता है।
तर्क इस विधि में, चर की एक प्रतिलिपि पारित की जाती है। इस विधि में, एक चर को ही पारित किया जाता है।
प्रभाव चर की प्रतिलिपि में किए गए परिवर्तन कभी भी फ़ंक्शन के बाहर चर के मान को संशोधित नहीं करते हैं। चर में परिवर्तन फ़ंक्शन के बाहर चर के मान को भी प्रभावित करता है।
मूल्य में परिवर्तन आपको वास्तविक चरों में कोई भी परिवर्तन करने की अनुमति नहीं देता है। फ़ंक्शन कॉल का उपयोग करके आपको चर के मानों में परिवर्तन करने की अनुमति देता है।
चर का पारित होना चरों के मानों को एक सरल विधि का उपयोग करके पारित किया जाता है। चरों के पते को संग्रहीत करने के लिए पॉइंटर चरों की आवश्यकता होती है।
मूल्य संशोधन मूल मूल्य संशोधित नहीं किया गया. मूल मान संशोधित किया गया है.
मेमोरी स्थान वास्तविक और औपचारिक तर्क
अलग-अलग तरीके से बनाया जाएगा
स्मृति स्थान
वास्तविक और औपचारिक तर्क
उसी में बनाया जाएगा
स्मृति स्थान
सुरक्षा वास्तविक तर्क अभी भी कायम हैं
सुरक्षित हैं क्योंकि उन्हें संशोधित नहीं किया जा सकता
गलती से।
वास्तविक तर्क नहीं हैं
सुरक्षित। वे हो सकते हैं
गलती से संशोधित किया गया है, इसलिए आपको तर्क संचालन को सावधानीपूर्वक संभालने की आवश्यकता है।
चूक कई प्रोग्रामिंग में डिफ़ॉल्ट
जैसी भाषाएँ C++.PHP. विजुअल बेसिक NET, और C#.
यह अधिकांश लोगों द्वारा समर्थित है
जावा जैसी प्रोग्रामिंग भाषाएं, लेकिन
डिफ़ॉल्ट के रूप में नहीं.

C में कॉल बाय वैल्यू विधि का उपयोग करने के लाभ

सी में मूल्य द्वारा कॉल के पक्ष/लाभ:

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

संदर्भ विधि द्वारा कॉल का उपयोग करने के लाभ

कॉल बाय रेफरेंस विधि का उपयोग करने के लाभ:

  • फ़ंक्शन तर्क का मान बदल सकता है, जो काफी उपयोगी है।
  • यह केवल एक मान रखने के लिए डुप्लिकेट डेटा नहीं बनाता है जिससे आपको मेमोरी स्पेस बचाने में मदद मिलती है।
  • इस पद्धति में दिए गए तर्क की कोई प्रतिलिपि नहीं होती है। इसलिए इसका प्रसंस्करण बहुत तेजी से होता है।
  • गलती से किए गए परिवर्तनों से बचने में आपकी सहायता करता है
  • कोड पढ़ने वाला व्यक्ति कभी नहीं जानता कि फ़ंक्शन में मान को संशोधित किया जा सकता है।

कॉल बाय वैल्यू विधि का उपयोग करने के नुकसान

यहां, कॉल बाय वैल्यू विधि के प्रमुख नुकसान/कमियां दी गई हैं:

  • वास्तविक पैरामीटर में परिवर्तन से संबंधित तर्क चर भी संशोधित हो सकते हैं
  • इस विधि में, तर्क चर होने चाहिए।
  • आप किसी फ़ंक्शन बॉडी में किसी चर को सीधे नहीं बदल सकते.
  • कभी-कभी तर्क जटिल अभिव्यक्ति हो सकते हैं
  • एक ही चर के लिए दो प्रतियां बनाई गई हैं जो मेमोरी कुशल नहीं है।

कॉल बाय रेफरेंस विधि का उपयोग करने के नुकसान

यहां, संदर्भ विधि द्वारा कॉल का उपयोग करने के प्रमुख नुकसान हैं:

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