2011-07-19 12 views
38

क्या पॉइंटर का आकार आकार के समान होता है जैसा कि इसके बिंदु पर इंगित करता है, या पॉइंटर्स के पास हमेशा एक निश्चित आकार होता है? उदाहरण के लिए ...सूचक का आकार क्या है?

int x = 10; 
int * xPtr = &x; 
char y = 'a'; 
char * yPtr = &y; 

std::cout << sizeof(x) << "\n"; 
std::cout << sizeof(xPtr) << "\n"; 
std::cout << sizeof(y) << "\n"; 
std::cout << sizeof(yPtr) << "\n"; 

इसका उत्पादन क्या होगा? sizeof(xPtr) रिटर्न 4 और sizeof(yPtr) रिटर्न 1 होगा, या 2 पॉइंटर्स वास्तव में एक ही आकार को वापस करेंगे? कारण मैं यह पूछता हूं क्योंकि पॉइंटर्स मेमोरी एड्रेस संग्रहीत कर रहे हैं, न कि उनके संबंधित संग्रहित पते के मूल्य।

उत्तर

55

पॉइंटर्स के पास आमतौर पर एक निश्चित आकार होता है, पूर्व के लिए। 32-बिट निष्पादन योग्य पर वे आमतौर पर 32-बिट होते हैं। कुछ अपवाद हैं, जैसे पुराने 16-बिट विंडोज़ पर जब आपको 32-बिट पॉइंटर्स और 16-बिट के बीच अंतर करना था ... आमतौर पर यह मानना ​​बहुत सुरक्षित है कि वे आधुनिक डेस्कटॉप ओएस पर दिए गए निष्पादन योग्य के भीतर वर्दी बनने जा रहे हैं। ।

संपादित करें: यहां तक ​​कि, मैं आपके कोड में इस धारणा बनाने के खिलाफ दृढ़ता से सावधानी बरतता हूं। यदि आप कुछ लिखने जा रहे हैं जो बिल्कुल एक निश्चित आकार के पॉइंटर्स रखना है, तो आप बेहतर जांच लेंगे!

फ़ंक्शन पॉइंटर्स एक अलग कहानी हैं - Jens' answer अधिक जानकारी के लिए देखें।

+5

सच नहीं, यहां तक ​​कि एक ही मशीन सूचक आकार पर भिन्न हो सकते हैं @ cf16 वे कर सकते हैं – 4pie0

+2

, लेकिन मेरे इस सवाल का जवाब केवल दावा है कि आधुनिक डेस्कटॉप ओएस के लिए, यानी Win32/64, लिनक्स ... तुम मुझे दे सकते हैं इसका एक उदाहरण उन प्रणालियों में से एक पर भिन्न होता है? –

+0

आपने कुछ अपवादों का उल्लेख किया है, उदाहरण के लिए, लेकिन ठीक – 4pie0

10

32-बिट मशीन आकार पॉइंटर 32 बिट्स (4 बाइट्स) पर है, जबकि 64 बिट मशीन पर यह 8 बाइट है। चाहे वे किस डेटा प्रकार की ओर इशारा कर रहे हों, उनके पास निश्चित आकार है।

+1

क्या गलत है? डेटा प्रकार पॉइंटर्स के लिए सवाल पूछा गया था ... – peeyush

+1

64 बिट मशीन पर 32 बिट निष्पादन योग्य के बारे में क्या? – Ident

0

एक सूचक का आकार आकार आपके सिस्टम के लिए आवश्यक 4 से एक अनूठा स्मृति पता धारण करने के लिए

+0

किसी शब्द को संबोधित मशीन पर चार की तरह चीजों को इंगित करते समय छोड़कर। –

54

समारोह प्वाइंटर बहुत अलग आकार हो सकता है (के बाद से एक सूचक सिर्फ पता यह बताते हैं करने के लिए रखती है), है कंपाइलर के आधार पर, X86 मशीन पर 20 बाइट्स तक। तो जवाब नहीं है - आकार भिन्न हो सकते हैं।

एक और उदाहरण: 8051 प्रोग्राम लें, इसमें तीन मेमोरी रेंज हैं और इस प्रकार लक्ष्य के आधार पर 8 बिट, 16 बिट, 24 बिट से तीन अलग-अलग सूचक आकार हैं, भले ही लक्ष्य का आकार हमेशा समान होता है (उदाहरण के लिए चार)।

+2

धन्यवाद, मैंने मज़ेदार पॉइंटर्स पर विचार करने के बारे में भी सोचा नहीं था। – MGZero

+1

यह केवल तब लागू होता है जब आप असेंबली को देख रहे हों। सी ++ में अलग-अलग आकार आपके दृश्य से छिपे हुए हैं। – Jay

+2

@Jay: बिल्कुल सही नहीं है। 'आकार (पी)' विभिन्न प्रकार के पॉइंटर्स के लिए अलग-अलग परिणाम दे सकता है। – Nemo

6

अपने अन्य प्रश्न का उत्तर देने के लिए। एक सूचक का आकार और जो भी इंगित करता है उसका आकार संबंधित नहीं है। डाक पते जैसे उन्हें एक अच्छा सादृश्य माना जाता है। घर के पते का आकार घर के आकार से कोई संबंध नहीं है।

+1

लेकिन ज़िप कोड अलग-अलग क्षेत्रों में अलग-अलग आकार हो सकते हैं, देखें [क्या एक ही आकार के सभी डेटा पॉइंटर्स हैं) (http://stackoverflow.com/questions/1241205/are-all-data-pointers-of-the- समान उत्पत्ति का आकार-इन-वन मंच)। उस बिंदुओं में कुछ संबंधों के विभिन्न प्रकारों के अलग-अलग आकार हो सकते हैं। –

+1

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

7

पॉइंटर्स हमेशा एक ही वास्तुकला पर समान आकार नहीं होते हैं।

आप "पास", "अब तक" और "विशाल" संकेत है, बस एक मामले में जहां सूचक आकार अलग करने का एक उदाहरण के रूप में ...

http://en.wikipedia.org/wiki/Intel_Memory_Model#Pointer_sizes

2

वे कर सकते हैं की अवधारणा के बारे में अधिक पढ़ सकते हैं शब्द-पता योग्य मशीनों (उदाहरण के लिए, क्रे पीवीपी सिस्टम) पर अलग रहें।

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

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

http://docs.cray.com/books/004-2179-001/html-004-2179-001/rvc5mrwh.html

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