मुझे भी इसका उत्तर देने का प्रयास करें।
संकेत संदर्भों के समान हैं। दूसरे शब्दों में, वे प्रतियां नहीं हैं, बल्कि मूल मूल्य को संदर्भित करने का एक तरीका है।
कुछ और करने से पहले, एक जगह जहां आपको आमतौर पर पॉइंटर्स का उपयोग करना होगा , जब आप एम्बेडेड हार्डवेयर के साथ काम कर रहे हों । हो सकता है कि आपको डिजिटल IO पिन की स्थिति को टॉगल करने की आवश्यकता हो। हो सकता है कि आप एक व्यवधान को संसाधित कर रहे हों और किसी विशिष्ट स्थान पर एक मूल्य को संग्रहीत करने की आवश्यकता हो। आपको चित्र मिल जाएगा। हालाँकि, यदि आप सीधे हार्डवेयर के साथ काम नहीं कर रहे हैं और केवल इस बारे में सोच रहे हैं कि किस प्रकार का उपयोग करना है, तो पढ़ें।
सामान्य चर के विपरीत बिंदुओं का उपयोग क्यों करें? जब आप कक्षाओं, संरचनाओं और सरणियों जैसे जटिल प्रकारों के साथ काम कर रहे हों तो उत्तर स्पष्ट हो जाता है। यदि आप एक सामान्य चर का उपयोग करने के लिए थे, तो आप एक प्रतिलिपि बना सकते हैं (कुछ परिस्थितियों में इसे रोकने के लिए कंपाइलर काफी स्मार्ट हैं और C ++ 11 भी मदद करता है, लेकिन हम अभी के लिए उस चर्चा से दूर रहेंगे)।
अब अगर आप मूल मूल्य को संशोधित करना चाहते हैं तो क्या होगा? आप कुछ इस तरह का उपयोग कर सकते हैं:
MyType a; //let's ignore what MyType actually is right now.
a = modify(a);
यह ठीक काम करेगा और यदि आप बिल्कुल नहीं जानते कि आप पॉइंटर्स का उपयोग क्यों कर रहे हैं, तो आपको उनका उपयोग नहीं करना चाहिए। "वे शायद तेज हो" कारण से सावधान रहें। अपने स्वयं के परीक्षण चलाएं और यदि वे वास्तव में तेज़ हैं, तो उनका उपयोग करें।
हालाँकि, मान लें कि आप एक समस्या का समाधान कर रहे हैं, जहाँ आपको मेमोरी आवंटित करने की आवश्यकता है। जब आप मेमोरी आवंटित करते हैं, तो आपको इसे निपटाना होगा। स्मृति आवंटन सफल हो भी सकता है और नहीं भी। यह वह जगह है जहां पॉइंटर्स उपयोगी होते हैं - वे आपको आपके द्वारा आवंटित ऑब्जेक्ट के अस्तित्व के लिए परीक्षण करने की अनुमति देते हैं और वे आपको उस ऑब्जेक्ट तक पहुंचने की अनुमति देते हैं जो सूचक को डी-रेफर करके स्मृति को आवंटित किया गया था।
MyType *p = NULL; //empty pointer
if(p)
{
//we never reach here, because the pointer points to nothing
}
//now, let's allocate some memory
p = new MyType[50000];
if(p) //if the memory was allocated, this test will pass
{
//we can do something with our allocated array
for(size_t i=0; i!=50000; i++)
{
MyType &v = *(p+i); //get a reference to the ith object
//do something with it
//...
}
delete[] p; //we're done. de-allocate the memory
}
यह इस बात की कुंजी है कि आप पॉइंटर्स का उपयोग क्यों करेंगे - संदर्भ यह मान लेते हैं कि जिस तत्व को आप संदर्भित कर रहे हैं वह पहले से मौजूद है । एक सूचक नहीं करता है।
दूसरे कारण कि आप पॉइंटर्स का उपयोग करेंगे (या कम से कम उनसे निपटने के लिए) क्योंकि वे एक डेटा प्रकार हैं जो संदर्भों से पहले मौजूद थे। इसलिए, यदि आप पुस्तकालयों का उपयोग उन चीजों को करने के लिए करते हैं, जिन्हें आप जानते हैं कि वे बेहतर हैं, तो आप पाएंगे कि इन पुस्तकालयों में से बहुत सारे जगह पर पॉइंटर्स का उपयोग करते हैं, बस इस वजह से कि वे कितने समय से आसपास हैं (बहुत सारे) उनमें से C ++ से पहले लिखा गया था)।
यदि आपने किसी लाइब्रेरी का उपयोग नहीं किया है, तो आप अपने कोड को इस तरह से डिज़ाइन कर सकते हैं कि आप पॉइंटर्स से दूर रह सकते हैं, लेकिन यह देखते हुए कि पॉइंटर्स भाषा के मूल प्रकारों में से एक हैं, आप इनका उपयोग करके जितना जल्दी आराम प्राप्त करेंगे, उतना ही अधिक पोर्टेबल आपका C ++ कौशल होगा।
एक स्थिरता के दृष्टिकोण से, मुझे यह भी उल्लेख करना चाहिए कि जब आप पॉइंटर्स का उपयोग करते हैं, तो आपको या तो उनकी वैधता के लिए परीक्षण करना होगा और मामले को संभालना होगा जब वे मान्य नहीं हों, या, बस मान लें कि वे वैध हैं और इस तथ्य को स्वीकार करें कि आपका कार्यक्रम दुर्घटनाग्रस्त हो जाएगा या खराब हो जाएगा कि धारणा टूट गई है। एक और तरीका रखें, पॉइंटर्स के साथ आपकी पसंद या तो कोड जटिलता या अधिक रखरखाव के प्रयास को शुरू करना है जब कुछ टूट जाता है और आप एक बग को ट्रैक करने का प्रयास कर रहे हैं जो कि त्रुटियों की एक पूरी श्रेणी से संबंधित है, जो मेमोरी भ्रष्टाचार की तरह है।
इसलिए यदि आप अपने सभी कोड को नियंत्रित करते हैं, तो संकेत से दूर रहें और इसके बजाय संदर्भों का उपयोग करें, जब आप कर सकते हैं तो उन्हें स्थिर रखें। यह आपको अपनी वस्तुओं के जीवन काल के बारे में सोचने के लिए मजबूर करेगा और आपके कोड को समझने में आसान बनाए रखेगा।
बस इस अंतर को याद रखें: एक संदर्भ अनिवार्य रूप से एक वैध सूचक है। एक सूचक हमेशा मान्य नहीं होता है।
तो क्या मैं यह कह रहा हूं कि इसका एक अमान्य संदर्भ बनाना असंभव है? नहीं, यह पूरी तरह से संभव है, क्योंकि C ++ आपको लगभग कुछ भी करने देता है। यह सिर्फ अनायास ही करना कठिन है और आप इस बात से चकित होंगे कि कितने कीड़े अनजाने में हैं :)