2010-06-27 25 views
18
char *str = "Hello"; 

char *ptr = str; 
char *&rptr = str; 

पीआरटी और आरपीटीआर के बीच क्या अंतर है? मैं समझता हूं कि आरपीटीआर एक सूचक (सिद्धांत में) का संदर्भ है लेकिन यह पीआरटी के साथ कार्यान्वयन के मामले में अलग कैसे है?एक सूचक के लिए संदर्भ

पॉइंटर्स का उपयोग कर लागू किए गए सी ++ में संदर्भ हैं?

+0

संभावित डुप्लीकेट: http://stackoverflow.com/questions/57483/difference-between-pointer-variable-and-reference-variable-in-c http://stackoverflow.com/questions/620604/difference- बीच-ए-पॉइंटर-एंड-रेफरेंस-पैरामीटर http: // stackoverflow।कॉम/प्रश्न/1 9 48467/के बारे में-सूचक-और-संदर्भ-वाक्यविन्यास और शायद अधिक ... – Alerty

+4

ध्यान दें कि आपका कोड लगभग एक वर्ष में अमान्य हो गया है। लगभग दस वर्षों तक 'char *' का उपयोग करके स्ट्रिंग अक्षर को इंगित करने के लिए अप्रचलित किया गया है। –

+0

@ जोहान्स - आपका मतलब मानक मानक स्ट्रिंग अक्षर की अनुमति नहीं देता है। अधिकांश किताबें अभी भी इस नोटेशन का उपयोग करती हैं। मेरे पास ऐसे विवरण का पूर्वावलोकन कहां हो सकता है? – Sam

उत्तर

18

पीआरटी और आरपीटीआर के बीच क्या अंतर है?

आप char *world = "World"; rptr = world; और फिर str प्रिंट है, यह "दुनिया" प्रिंट होगा। यदि आप ptr = world; करते हैं और फिर str प्रिंट करते हैं, तो यह "हैलो" प्रिंट करेगा।

+3

यानी, आरपीटीआर स्ट्रिंग के लिए एक उपनाम है, पीआरटी एक प्रतिलिपि है। यदि आप कहीं और स्ट्र को इंगित करते हैं, तो यह आरपीआरआर को प्रभावित करेगा, लेकिन पीटीआर नहीं। दूसरे शब्दों में, आप कह सकते हैं कि str और rptr 2 अलग-अलग चर (2 अलग-अलग नाम) हैं, लेकिन एक ही सूचक। – apollodude217

+0

जबकि वास्तव में आपके उत्तर का सारांश सही है, ध्यान दें कि आप 'rptr = "world" नहीं कर सकते क्योंकि '" दुनिया "' 'char *' सूचक नहीं है। चार सरणी के लिए चार सरणी का अंतर्निहित रूपांतरण यहां नहीं किया जाएगा, क्योंकि यह एक गैर-कॉन्स्ट संदर्भ है। –

+0

@ sepp2k यह अभी भी गलत है। मुझे यह दिखाने के लिए कोड को ठीक करने दें कि क्या गलत है। अब आपके पास एक ही स्थिति है: आपके पास एक सरणी है लेकिन आप इसे 'char *' के गैर-कॉन्स्ट संदर्भ को बाध्य करने का प्रयास करते हैं - यह काम नहीं करेगा। यह सिर्फ 'फ्लोट ए = 0 की तरह है; int &r = a; 'विफल रहता है। यह अनदेखा करना आसान है, लेकिन एक बार जब आप देखते हैं कि यह क्या हो रहा है तो समझने में आसान है। –

5

इस प्रयास करें:

#include <iostream> 
int main() { 
    char *str1 = "Hello "; 
    char *str2 = "World!"; 
    char *ptr = str1; 
    char *&rptr = str1; 
    rptr = str2; 
    std::cout << ptr << str1 << std::endl; 
} 

यह प्रिंट "नमस्ते दुनिया!" क्योंकि ptr स्ट्रिंग शाब्दिक "हैलो" को इंगित करने वाला एक चार सूचक है। rptr एक चार सूचक का संदर्भ है, इसलिए जब आप इसे बदलते हैं (पॉइंटर, वह चीज़ जो इसे इंगित करता है।) आप str1 बदलते हैं। और इस प्रकार ptr "हैलो" को इंगित करता है। str1 अंक "दुनिया!"।

11

str पता (और इसलिए अंक) को एक शाब्दिक स्ट्रिंग, "हैलो" में संग्रहीत करता है, जो कहीं भी स्मृति के केवल पढ़ने वाले खंड में संग्रहीत होता है।

पीआरआर 'str' के समान पते पर इंगित करता है।

rptr मूल रूप से 'str' को इंगित करता है (स्ट्रॉ के समान पॉइंट पर नहीं, बल्कि स्वयं स्ट्रिंग के लिए)। संदर्भों के लिए 'पॉइंट टू' का उपयोग करना असामान्य हो सकता है लेकिन वे वास्तव में पॉइंटर्स की तरह बहुत अधिक हैं (इस मामले में एक पॉइंटर को पॉइंटर) थोड़ा सा वाक्य रचनात्मक अंतर और प्रतिबंध के अलावा कि वे उनके दौरान किसी अन्य पते को इंगित नहीं कर सकते जीवन काल।

यह अनुरूप होगा:

char** const rptr = &str; 

एक संदर्भ की तरह, rptr ऊपर एक नया पता नहीं सौंपा जा सकता है (इसे बदल नहीं सकते हैं यह करने के लिए क्या इशारा कर रहा है), लेकिन यह अपने pointee बदलने के लिए मुक्त किया जा सकता है (जो इस मामले में 'str' के लिए एक सूचक होने के लिए होता है)।

*rptr = 0; // after this, str == 0 

संदर्भ काफी केवल पढ़ने के लिए सूचक (नहीं केवल पढ़ने के लिए pointee करने के लिए एक परिवर्तनशील सूचक) केवल वे pointee (संदर्भित डाटा) पर पाने के लिए एक dereferencing ऑपरेटर की आवश्यकता नहीं है के रूप में ही कर रहे हैं:

char *str = "Hello"; 
char *&rptr = str; 
rptr = 0; // after this, str == 0 

सूचक को केवल-पढ़ने के सूचक के साथ ऊपर के उदाहरण से फर्क सिर्फ इतना है कि हम ऑपरेटर का उपयोग करने के लिए नहीं था * है।

कॉन्स संदर्भों में अस्थायी लोगों के जीवनकाल को बढ़ाने में सक्षम होने की अनूठी संपत्ति भी है, लेकिन यह शायद चर्चा के दायरे से बाहर है।

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