2012-08-07 14 views
6

कृपया नीचे क्या गलत है?सी ++ पॉइंटर्स और संदर्भों पर, स्पष्टीकरण की आवश्यकता

यह मेरी समझ है कि एक सूचक कुछ प्रकार के किसी पते का प्रतिनिधित्व करता है।

तो, int i = 18, यह करने के लिए एक सूचक है जब हम एक समारोह

void bar (int *something) 

के रूप में हम बेहतर करने के लिए एक सूचक भेजने की घोषणा int *pI = &i;

निम्नलिखित 2 घोषणाओं वैध

void foo (int &something) // Will accept an address of something 
void bar (int *something) // Will accept a pointer to something 

हैं कुछ कुछ। वास्तव में, foo(pI) काम करता है।

एक ही तर्क के बाद, जब

void foo (int &something) 

को देखकर हम यह कुछ एक तर्क के रूप में एक पूर्णांक की ओर इशारा करते के एक पते भेजना चाहिए, तो फिर:

क्यों foo(&i) गलत क्या है?

उत्तर

5

void foo (int &something) // Will accept an address of something

यह गलत है: int& एक संदर्भ, एक अवधारणा है कि कुछ मायनों में संकेत करने के लिए समान है, लेकिन सभी में समान नहीं है।

संदर्भ पॉइंटर्स के समान हैं कि एक संदर्भ के माध्यम से एक मूल्य बदला जा सकता है, जैसे इसे एक सूचक के माध्यम से बदला जा सकता है। हालांकि, "शून्य संदर्भ" जैसी कोई चीज़ नहीं है, जबकि नल पॉइंटर्स बहुत आम हैं।

जब आप एक समारोह है कि एक संदर्भ लेता है कहते हैं, तो आप बस चर संदर्भ पारित आप लेने के लिए जो कर रहे हैं - कोई & ऑपरेटर की जरूरत है:

void foo (something); // "something" must be a variable 
2

घोषणा void foo (int &something) एक reference variable, नहीं एक सूचक लेता है ।

आप सिवाय इसके कि somethingpassed by reference, नहीं by value है, यह बिल्कुल वैसा ही आप void foo (int something) कहेंगे के रूप में कहते हैं।

0

शून्य foo (int & कुछ) // कुछ

नहीं के एक पते स्वीकार करेंगे, हालांकि मैं भ्रम की स्थिति को समझ सकते हैं। उस समारोह में संदर्भ से int लेता है। संदर्भ एक अच्छी तरह से परिभाषित कार्यक्रम में गैर-शून्य होने की गारंटी है। यह एक सूचक के लिए वैचारिक रूप से समान है, लेकिन अर्थात् अलग है।

उस समारोह को कॉल करने के लिए आपको कुछ भी विशेष करने की आवश्यकता नहीं है।

int i = 10; 
foo(i); // passed to foo by reference 
0

क्योंकि C++ & का अर्थ है "संदर्भ प्रकार" एक समारोह प्रोटोटाइप के संदर्भ में के रूप में आप इसे यहाँ का उपयोग कर रहे हैं। आपका कार्यः

void foo (int &something) 

वास्तव में निर्दिष्ट करने की जाती है कि एक पूर्णांक संदर्भ प्रकार पारित किया जाना चाहिए, ताकि आप आसानी से इस तरह इस समारोह कहेंगे:

foo(i); 

ध्यान दें कि इस मामले में आप अभी भी पता गुजर रहे हैं फ़ंक्शन में i का, लेकिन आप इसे कच्चे सूचक के बजाय संदर्भ प्रकार के रूप में कर रहे हैं।

0

दो& के लिए अलग-अलग अर्थ हैं।

पहला मौजूदा चर से पॉइंटर बनाना है।

दूसरा संदर्भ देना है।

भले ही वे दोनों एक ही चरित्र का उपयोग करते हैं, वे दो पूरी तरह से अलग चीजें हैं।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^