2010-02-17 25 views
7

संभव डुप्लिकेट:
Difference between value parameter and reference parameter ?अंतर

संदर्भ द्वारा कॉल बीच क्या अंतर है और मूल्य से कहते हैं?

+1

होमवर्क प्रश्न :) – Shoban

+7

बहुत से लोगों को प्रश्न बंद करने के लिए पर्याप्त प्रतिनिधि लगता है और फिर भी "असली नहीं प्रश्न "बंद करने का कारण। यह एक सटीक उत्तर के साथ स्पष्ट रूप से एक वास्तविक सवाल है, भले ही यह क्यों पूछा जा रहा है। –

उत्तर

0

तर्क समारोह के लिए पारित दो प्रकार अर्थात् 1. मान पारित हो सकता है 2. पता पारित कर दिया

पहले प्रकार मूल्य से कॉल करने के लिए संदर्भित करता है और दूसरे प्रकार के संदर्भ द्वारा कॉल करने के लिए संदर्भित करता है। उदाहरण के लिए विचार करना program1

main() 
    { 
     int x=50, y=70; 
     interchange(x,y); 
     printf(“x=%d y=%d”,x,y); 
    } 

    interchange(x1,y1) 
    int x1,y1; 
    { 
     int z1; 
     z1=x1; 
     x1=y1; 
     y1=z1; 
     printf(“x1=%d y1=%d”,x1,y1); 
    } 

यहाँ इंटरचेंज कार्य करने के लिए मूल्य मूल्य द्वारा पारित कर दिया है।

पर विचार करें program2

main() 
{ 
    int x=50, y=70; 
    interchange(&x,&y); 
    printf(“x=%d y=%d”,x,y); 
} 

interchange(x1,y1) 
int *x1,*y1; 
{ 
    int z1; 
    z1=*x1; 
    *x1=*y1; 
    *y1=z1; 
    printf(“*x=%d *y=%d”,x1,y1); 
} 

यहाँ समारोह संदर्भ द्वारा कहा जाता है। दूसरे शब्दों में पता & का उपयोग करके पारित किया जाता है और प्रतीक * प्रतीक का उपयोग करके उपयोग किया जाता है।

उनके बीच मुख्य अंतर प्रोग्राम 1 और प्रोग्राम 2 के आउटपुट का विश्लेषण करके देखा जा सकता है।

program1 के उत्पादन में वह यह है कि मूल्य द्वारा कॉल

x1=70 y1=50 
x=50 y=70 

है लेकिन program2 के उत्पादन में संदर्भ द्वारा कॉल है कि

*x=70 *y=50 
x=70 y=50 

है इसका कारण यह है मूल्य मूल्य द्वारा कॉल के मामले में इंटरचेंज के रूप में नामित समारोह में पारित किया गया है और वहां मूल्य को बदल दिया गया है और

x1=70 y1=50 

और फिर से के बाद से कोई भी मान मुख्य कार्य अर्थात्

x=50 y=70 got printed. 
+1

वाह, के एंड आर शैली पैरामीटर गुजर रहा है :) – Messa

+3

मुझे पता नहीं था कि लोग अभी भी के एंड आर सी में प्रोग्राम किए गए हैं :-) –

+0

@ मेसा, @ आलोक, मैं बस अवधारणा को समझाने की कोशिश कर रहा था, व्यक्तिगत रूप से मैंने कभी कॉलेज के बाद सी में कोड नहीं किया है और आश्चर्यचकित करने के लिए मुझे नहीं पता था कि यह मुझे बताए जाने के लिए के एंड आर शैली धन्यवाद है :) –

0
Call by value: 

1 
2 
3 
4 
5 
6 
7 
    void foo(int x) { 
     cout << x << endl; 
     x = 4; 
    } 

    int someVar = 5; 
    foo(someVar); 


The value 5 is pushed onto the stack and foo is called. Inside foo(), 5 is popped off the stack and output. x = 4 modifies the stack copy, which is then thrown away when the function returns. 

1 
2 
3 
4 
5 
6 
7 
    void foo(int& x) { 
     cout << x << endl; 
     x = 4; 
    } 

    int someVar = 5; 
    foo(someVar); 


The address of someVar is pushed onto the stack and foo is called. Inside foo, the address is popped off the stack and the integer stored at that address is output. x = 4 modifies the memory referred to by the address, which means that when foo() returns, someVar now has the value 4. 

Contrast the above code to 

1 
2 
3 
4 
5 
6 
7 
    void foo(int* x) { 
     cout << *x << endl; 
     *x = 4; 
    } 

    int someVar = 5; 
    foo(&someVar); 


This code does the exact same thing as my reference example, it's just the syntax is a bit different: note the &someVar where foo is called, and note the *x in foo() to refer to the integer value. 
11

सी में के रूप में वापस और इसलिए x और y के मूल मूल्यों लौटा दिए जाते हैं, वहाँ संदर्भ द्वारा कोई कॉल नहीं है। आप जो निकटतम प्राप्त कर सकते हैं वह पता ले रहा है, और उस पते की एक प्रति पास कर रहा है (मूल्य से - नीचे देखें)।

सी ++ में, संदर्भ द्वारा कॉल किसी ऑब्जेक्ट (मूल ऑब्जेक्ट के लिए उपनाम) का संदर्भ पास करता है। आम तौर पर इसे ऑब्जेक्ट के पते के रूप में लागू किया जाएगा, हालांकि इसकी गारंटी नहीं है।

मूल्य से कॉल का मतलब है किसी प्रकार का मूल्य लेना, और उस मूल्य की प्रतिलिपि को फ़ंक्शन में पास करना।

मूल अंतर यह है कि जब आप मान द्वारा पैरामीटर पास करते हैं, तो फ़ंक्शन को केवल मूल ऑब्जेक्ट की कॉपी करता है, इसलिए यह मूल ऑब्जेक्ट को प्रभावित करने के लिए कुछ भी नहीं कर सकता है। संदर्भ के अनुसार, यह मूल वस्तु का संदर्भ प्राप्त करता है, इसलिए इसकी मूल वस्तु तक पहुंच है, इसकी एक प्रति नहीं - जब तक यह एक कॉन्स्ट संदर्भ नहीं है, यह मूल वस्तु को संशोधित कर सकता है (एक उदाहरण के लिए)।

3

संक्षेप में, कॉल संदर्भ कर रहा है जब एक समारोह अपने तर्कों को संशोधित कर सकते हैं: "संदर्भ द्वारा कॉल" में

def f(x): 
    x := x + 1 
    print(x) 

x := 1 
f(x) 
/* Now, x is 2 */ 
print(x) 

, ऊपर दो बार 2 प्रिंट होगा।

मूल्य द्वारा कॉल करें जब कोई फ़ंक्शन उसमें पारित तर्क की एक प्रति प्राप्त करता है, तो कॉलर द्वारा कोई भी संशोधन नहीं देखा जाता है। f(x) ऊपर परिभाषित के साथ, मूल्य से कॉल होगा:

x := 1 
f(x) 
/* x is 1 in the caller */ 
print(x) 

ऊपर में, f(x) अंदर, प्रिंट कॉल 2 मुद्रित होगा, लेकिन यह है कि केवल x की प्रतिलिपि कि f() मिला संशोधित करता है, फोन करने वाले में ऐसा है, x अभी भी एक है, और दूसरा print()1 प्रिंट करता है।

0

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