2010-02-25 20 views
33

निरंतर सूचक और संदर्भ के बीच क्या अंतर है?कॉन्स के बीच अंतर। सूचक और संदर्भ?

नाम के रूप में निरंतर सूचक का अर्थ फिर से बाध्य नहीं किया जा सकता है। संदर्भ के साथ ही मामला है।

मुझे आश्चर्य है कि दूसरे पर किस तरह के परिदृश्यों को प्राथमिकता दी जाएगी। उनके सी ++ मानक और उनके कार्यान्वयन कितना अलग है?

चियर्स

उत्तर

43

स्थिरांक संकेत के 3 प्रकार के होते हैं:

//Data that p points to cannot be changed from p 
const char* p = szBuffer; 

//p cannot point to something different. 
char* const p = szBuffer; 

//Both of the above restrictions apply on p 
const char* const p = szBuffer; 

विधि # 2 ऊपर एक संदर्भ के समान है।

  • कॉन्स्ट संकेत शून्य हो सकता है:

    ऊपर संदर्भ और स्थिरांक संकेत के 3 प्रकार के सभी के बीच मुख्य अंतर हैं।

  • एक संदर्भ में इसका अपना पता नहीं है जबकि एक सूचक है।
    संदर्भ का पता वास्तविक वस्तु का पता है।

  • एक सूचक का अपना पता है और यह उसके मूल्य के मूल्य के रूप में है।

  • my answer here for much more differences between references and pointers देखें।

+2

इसके अलावा, एक संदर्भ किसी संदर्भ में _alias_ है। इसका मतलब है कि संदर्भ को बिना किसी संदर्भ के इस्तेमाल किया जा सकता है (भ्रमित शब्दावली को क्षमा करें)। –

6

मुझे लगता है कि आप एक स्थिरांक मान सूचक (जैसे int * स्थिरांक PTR) मतलब है, नहीं स्थिरांक के लिए सूचक (जैसे पूर्णांक स्थिरांक * ptr)।

  • नहीं (अप्रारंभीकृत संकेत की समस्या टाल) एक संकलन त्रुटि एक संदर्भ के आरंभ होने
  • एक सूचक भी एक सरणी लेकर जा सकते हैं, या यह शून्य हो सकता है, जहां एक संदर्भ हमेशा ठीक एक वस्तु को दर्शाता है।

    एक स्थिरांक सूचक शून्य पर बात कर सकते हैं:

  • वाक्य रचना बहुत अलग
+0

आप ** ** सरणी तत्व का संदर्भ दे सकते हैं: 'int & intRef (intArray [2]);'। सरणी तत्व के पते पर एक सरणी बिंदुओं को इंगित करने वाला एक कॉन्स्ट पॉइंटर। मुझे यकीन नहीं है कि आपके दूसरे बुलेट का सरणी हिस्सा बहुत अधिक है। शायद आप का मतलब है कि आप एक सूचक पर '[]' ऑपरेटर का उपयोग कर सकते हैं। – thebretness

0

कुछ मतभेद है।

एक कॉन्स पॉइंट ऑब्जेक्ट्स की एक सरणी को इंगित कर सकता है।

एक कॉन्स पॉइंटर स्थिरता को दूर करके फिर से बाध्य हो सकता है।

+0

एक पॉइंटर ऑब्जेक्ट्स की सरणी के पहले तत्व को इंगित कर सकता है .... आप समान रूप से एक सरणी सूचक प्रकार भी कर सकते हैं और इस तरह के एक प्रकार के संदर्भ भी कर सकते हैं। –

+0

कास्टिंग कास्टिंग बेहद दुर्लभ, अच्छी तरह से उचित, और अच्छी तरह से प्रलेखित होना चाहिए। सामान्य कार्यक्षमता के साथ मिश्रित बहुत सारे कास्टिंग आमतौर पर एक खराब डिजाइन का एक लक्षण है। – thebretness

+0

स्थिरता को दूर करने और निरंतर चर में लिखने से एक सेगमेंटेशन गलती मिलती है, इसलिए यह निश्चित रूप से एक अच्छा विचार नहीं है। कॉन्स्टेंट अलग-अलग पढ़ने-योग्य स्मृति क्षेत्र पर संग्रहीत कई प्रणालियों पर होते हैं, या उनके मूल्यों को पूरी तरह से पढ़ने से परहेज करते हुए, संकलक द्वारा गणनाओं के लिए सीधे प्रतिस्थापित किया जा सकता है। – Tronic

6

जब आप प्रत्येक उपयोग करना चाहिए:

संदर्भ: डिफ़ॉल्ट रूप से इन का प्रयोग करें। लोगों के लिए नल पॉइंटर्स को अपमानित करना बहुत आम है। आप उस जोखिम को संदर्भ के साथ खत्म करते हैं।

कॉन्स पॉइंटर: जब आप कोई संदर्भ चाहते हैं, लेकिन एक नहीं बना सकते हैं। उदाहरण के लिए, आप एक ड्राइवर लिख रहे हैं, और आप एक मेमोरी मैप की शुरुआत में एक सूचक चाहते हैं।एक संदर्भ उस मामले में ज्यादा समझ में नहीं आता है। साथ ही, यदि आपको चीजों की एक सरणी की आवश्यकता है, तो एक संदर्भ काम नहीं करेगा (हालांकि संदर्भ सदस्यों के साथ सरल वर्गों की एक सरणी होगी)।

अगले उदाहरण में, एक स्थिरांक सूचक है कि एक संदर्भ की जाँच नहीं कर सकते हैं एक त्रुटि की जाँच करता है:

int addFour(int* register){ 
    if(isNull(arg)){ 
    throw NullPointerException(); 
    } 

    // some stuff 
    *register += 4; 

    return register; 
} 

// This could be any function that does pointer math. 
bool isNull(const int* ptr){ 
    return(NULL == ptr); 
} 
2

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

int a[3] = {39, 18, 97}; 
int * const b = a; 
int c = *(b+1); // sets c = 18 
संबंधित मुद्दे