2012-01-19 12 views
6

मुझे संदर्भों में एक परेशानी है।फ़ंक्शन तर्क के रूप में संदर्भ?

void pseudo_increase(int a){a++;} 
int main(){ 
    int a = 0; 
    //.. 
    pseudo_increase(a); 
    //.. 
} 

यहाँ, चर a का मूल्य एक क्लोन के रूप में वृद्धि नहीं होगी या इसे की प्रतिलिपि पारित कर दिया और नहीं कर रहा है चर ही: इस कोड पर विचार करें। - लेकिन क्यों

void true_increase(int& a){a++;} 
int main(){ 
    int a = 0; 
    //.. 
    true_increase(a); 
    //.. 
} 

यहाँ यह कहा जाता है a के मूल्य में वृद्धि होगी:
अब हमें एक एक और उदाहरण पर विचार करते हैं?

जब true_increase(a) कहा जाता है, a की एक प्रति पारित की जाएगी। यह एक अलग चर होगा। इसलिए &aa के वास्तविक पते से अलग होगा। तो a का मूल्य कैसे बढ़ता है?

मुझे सही करें जहां मैं गलत हूं।

+1

आपको फ़ंक्शन तर्क के लिए अलग-अलग पहचानकर्ताओं का उपयोग करना चाहिए और चर को पारित किया जाना चाहिए ताकि आप स्वयं को और भी भ्रमित न करें। – AusCBloke

+1

संदर्भ द्वारा उत्तीर्ण एक प्रतिलिपि नहीं बनाता है। यह एक ही चर के संदर्भ है। – jweyrich

+0

मेरा सुझाव है कि आप पॉइंटर्स के बारे में पहले सीखें कि कैसे संदर्भ अनियमित वस्तुओं और अमान्य पॉइंटर्स आदि के दर्द को कम कर सकते हैं। अपनी पसंदीदा सी/सी ++ किताबों में से कोई भी चुनें! – sarat

उत्तर

6

निम्न उदाहरण पर विचार करें। जो भी आप b को असाइन करते हैं, उसे a पर भी असाइन किया जाएगा (क्योंकि ba का संदर्भ है)। एक पैरामीटर by reference पासिंग कोई अलग है:

void foo(int &b) 
{ 
    b = 2; 
} 

int main() 
{ 
    int a = 1; 
    foo(a); 
    printf("a = %d\n", a); //output: a = 2 
    return 0; 
} 
5

जब true_increase (क) कहा जाता है, की प्रति 'एक' पारित हो जाएगा

है वहीं तुम गलत हो। a का संदर्भ दिया जाएगा। & पैरामीटर प्रकार के बगल में है। संदर्भ के साथ होने वाला कोई भी ऑपरेशन रेफरेंस पर लागू होता है।

int a = 1; 
int &b = a; 
b = 2; // this will set a to 2 
printf("a = %d\n", a); //output: a = 2 

यहाँ b एक उर्फ ​​a के लिए की तरह व्यवहार किया जा सकता है:

1
अपने true_increase में

(पूर्णांक & क) समारोह, क्या कोड के अंदर हो रही है पूर्णांक मान आपके द्वारा उल्लिखित की कॉपी नहीं है। यह उसी स्मृति स्थान का संदर्भ है जिसमें आपका पूर्णांक मान कंप्यूटर मेमोरी में रहता है। इसलिए, उस संदर्भ के माध्यम से किए गए कोई भी परिवर्तन वास्तविक पूर्णांक के साथ होंगे जो आपने मूल रूप से घोषित किया था, इसकी प्रतिलिपि नहीं। इसलिए, जब फ़ंक्शन वापस आता है, तो संदर्भ के माध्यम से आप चर के लिए किए गए किसी भी परिवर्तन को मूल चर में ही दिखाई देगा। यह सी ++ में संदर्भ द्वारा मूल्यों को पारित करने की अवधारणा है।

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