2011-12-20 11 views
37

Possible Duplicate:
What are the differences between pointer variable and reference variable in C++?
Are there benefits of passing by pointer over passing by reference in C++?दर्रा संदर्भ

दोनों ही मामलों में से सूचक और पास से, मैं परिणाम हासिल की। तो एक दूसरे पर कब पसंद किया जाता है? हम एक दूसरे के ऊपर क्या कारण हैं?

#include <iostream> 
using namespace std; 
void swap(int* x, int* y) 
{ 
    int z = *x; 
    *x=*y; 
    *y=z; 
} 
void swap(int& x, int& y) 
{ 
    int z = x; 
    x=y; 
    y=z; 
} 

int main() 
{ 
    int a = 45; 
    int b = 35; 
    cout<<"Before Swap\n"; 
    cout<<"a="<<a<<" b="<<b<<"\n"; 

    swap(&a,&b); 
    cout<<"After Swap with pass by pointer\n"; 
    cout<<"a="<<a<<" b="<<b<<"\n"; 

    swap(a,b); 
    cout<<"After Swap with pass by reference\n"; 
    cout<<"a="<<a<<" b="<<b<<"\n"; 
} 

आउटपुट

Before Swap 
a=45 b=35 
After Swap with pass by pointer 
a=35 b=45 

After Swap with pass by reference 
a=45 b=35 
+0

http://stackoverflow.com/questions/114180/pointer-vs-reference –

+0

[क्या सी ++ में संदर्भ द्वारा पारित होने पर पॉइंटर द्वारा गुजरने के लाभ हैं?] (Http://stackoverflow.com/q/334856/ 187543) – cpx

उत्तर

23

एक संदर्भ शब्दार्थ पीछा कर रहा है:

T& <=> *(T * const)

const T& <=> *(T const * const)

T&& <=> [no C equivalent] (सी ++ 11)

अन्य उत्तरों के साथ, सी ++ एफएक्यू से निम्नलिखित एक पंक्ति का जवाब है: जब संभव हो तो संदर्भ, आवश्यक होने पर पॉइंटर्स।

पॉइंटर्स पर एक लाभ यह है कि आपको पूर्ण पास करने के लिए स्पष्ट कास्टिंग की आवश्यकता है। हालांकि यह अभी भी संभव है। compilers मैं परीक्षण किया है में से कोई भी निम्नलिखित के लिए एक चेतावनी फेंकना:

int* p() { 
    return 0; 
} 
void x(int& y) { 
    y = 1; 
} 
int main() { 
    x(*p()); 
} 
+1

संदर्भ किसी संदर्भित वस्तु को संदर्भित करने के लिए संदर्भित वस्तु को प्रतिबंधित नहीं करते हैं। उदाहरण के लिए, आप स्थानीय चर के संदर्भ को वापस कर सकते हैं। –

+1

यदि आप एक पूर्ण सूचक को अस्वीकार करते हैं तो एक अमान्य संदर्भ प्राप्त करना संभव है, इसलिए आपको अभी भी कॉलिंग कोड में सावधान रहना होगा। Http://stackoverflow.com/questions/57483/what-are-the-differences-between-pointer-variable-and-reference-variable-in-c/57656#57656 –

+0

यह संभव है, लेकिन जब तक आप अस्वीकार नहीं कर रहे हैं अनचेक पॉइंटर्स, तो ऐसा नहीं होना चाहिए। और यदि आप उन्हें संदर्भित करने से पहले पॉइंटर्स की जांच नहीं करते हैं, तो मेरे पास आपके लिए खबर है ... – moshbear

4

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

नल पॉइंटर एक पैरामीटर अप्रयुक्त या वैध नहीं कहने के लिए एक आसान सम्मेलन है, इसलिए उस मामले में एक सूचक का उपयोग करें।

संदर्भ सेट होने के बाद संदर्भ अपडेट नहीं किए जा सकते हैं, इसलिए यदि आपको कभी भी इसे पुन: असाइन करने की आवश्यकता हो तो पॉइंटर का उपयोग करें।

प्रत्येक मामले में एक संदर्भ पसंद करें जहां कोई अच्छा कारण नहीं है। यदि आप कर सकते हैं तो इसे const बनाएं।

6

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

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

असल में, संदर्भ और संकेत बहुत अलग देखने के लिए, के एक कार्यान्वयन बिंदु मुख्य (और बहुत महत्वपूर्ण) अंतर दर्शन में है से नहीं कर रहे हैं: एक संदर्भ वस्तु ही है, सिर्फ एक अलग नाम के साथ है।

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

1

केवल संदर्भों का उपयोग केवल समय और पॉइंटर्स का उपयोग करें जब आपको NULL का संदर्भ देना होगा, जो संदर्भ संदर्भित नहीं कर सकता है। "जब आप करने के लिए है जब आप कर सकते हैं संदर्भ का उपयोग करें, और संकेत दिए गए।" - http://www.parashift.com/c++-faq-lite/references.html#faq-8.6

+0

'int और x = * static_cast (NULL);'। बस इतना ही। – moshbear

4

Here इस मामले पर एक अच्छा लेख है:

इस प्रश्न देखें