2009-01-04 22 views

उत्तर

39

एक सूचक शून्य करने के लिए, void* किसी भी वस्तु को इंगित कर सकते हैं:

int a = 5; 
void *p = &a; 

double b = 3.14; 
p = &b; 

आप कर सकते हैं नहीं भिन्नता, वेतन वृद्धि या घटती है कि सूचक है, क्योंकि आप आप किस प्रकार को इंगित पता नहीं है। विचार यह है कि void* का उपयोग memcpy जैसे कार्यों के लिए किया जा सकता है जो कि बस स्मृति ब्लॉक को प्रतिलिपि बनाते हैं, और उनकी प्रतिलिपि के प्रकार की परवाह नहीं करते हैं।

+0

वाउ - मुझे एहसास नहीं हुआ कि आप एक शून्य * बढ़ा नहीं सकते! धन्यवाद! – xtofl

+0

काफी कुछ कंपाइलर्स आपको देंगे - वे मानते हैं कि सभी सूचक प्रकार 32 बिट हैं। यह गलत है लेकिन विंडोज़ पर आम है जहां लोग 32 बिट x86 मानते हैं। –

+0

@ एमजीबी: कभी ऐसा कंपाइलर कभी नहीं देखा। – dalle

3

यह स्मृति में एक स्थान के लिए एक कच्चा सूचक है। यह किसी भी पॉइंटर अंकगणित जैसे char * या int * की अनुमति नहीं देता है।

यहाँ उपयोग

http://theory.uwinnipeg.ca/programming/node87.html

4

यह सिर्फ एक सामान्य सूचक है, जब आप प्रकार पता नहीं है डेटा पास करने के लिए प्रयोग किया जाता है के कुछ उदाहरण हैं। इसका उपयोग करने के लिए आपको इसे सही प्रकार पर डालना होगा।

2

यह कुछ भी पर एक सूचक है - बस एक स्मृति का एक हिस्सा जिसे आप खेल सकते हैं - एक वस्तु हो सकती है, एक char हो सकती है। आपको इसके साथ कुछ भी उपयोगी करने के लिए डालना है।

2

Building off my prior posting...


ध्यान दें: यहाँ सभी स्मृति पतों काल्पनिक हैं। मैं बस उन्हें एक बिंदु को चित्रित करने के लिए बना रहा हूँ।


को देखते हुए:

int data[] = {10,11,12}; 

हम अब है:

0xffff0000-0xffff0003 with a value of (int)(10) 
0xffff0004-0xffff0007 with a value of (int)(11) 
0xffff0008-0xffff000b with a value of (int)(12) 

(मैं नहीं यहां बड़े endian बनाम छोटे-endian बाइट आदेश में प्राप्त करने के लिए जा रहा है।)

यदि हमारे पास है:

int * p = data; 

अब हम कहीं और एक और स्मृति स्थान है कहते हैं:

0xaaaa0000-0xaaaa0003 with a value of (int*)0xffff0000 

हम [1] [या * (पी +1)] का उल्लेख करने के पी का उपयोग कर सकते करने के लिए * (int *) (0xffff0004) [= 11] आकार के रूप में (int) = 4 और 0xffff0000 + sizeof (int) = 0xffff0004।

तो हमने:

void * v = data; 

अब हम एक और स्मृति स्थान कहीं और है, कहते हैं:

0xbbbb0000-0xbbbb0003 with a value of (void*)0xffff0000. 

हालांकि, शून्य कोई भी संबद्ध sizeof() जानकारी नहीं है।हम सूचक में वृद्धि या कमी नहीं कर सकते हैं। हम 0xffff0000 में संग्रहीत डेटा तक पहुंचने के लिए अपमान नहीं कर सकते हैं। हम केवल कच्चे मेमोरी पते के रूप में मूल्य का उपयोग कर सकते हैं।

यदि हम (void *) 0xffff0000 में संग्रहीत डेटा का उपयोग करना चाहते हैं, तो हमें पहले इसे उचित प्रकार पर डालना होगा।

उसने कहा, (शून्य *) अभी भी मनमाने ढंग से डेटा संरचनाओं के पते को पारित करने के साधन के रूप में काफी उपयोगी है। उदाहरण के लिए, स्मृति()। इससे कोई फर्क नहीं पड़ता कि मैं संरचना टीएम या संरचना सॉकडर से बाहर निकल रहा हूं या नहीं। हमें सिर्फ संरचना और उसके आकार के लिए एक सूचक की आवश्यकता है।

(यह ऐसा करते समय, आभासी सूचक तालिका को अधिलेखित करने में करते हुए कहा कि बिना जाना चाहिए, लेकिन ... एक वर्ग के उदाहरण को शून्य करने के लिए memset का उपयोग कर खबरदार और।)

1

एक शून्य सूचक एक वर्ग के सदस्य को इंगित नहीं कर सकते सी ++ में।

+0

यह सही है, वे अलग-अलग आकार के पॉइंटर्स हैं। – Joshua

+0

मुझे लगता है कि ऐसा इसलिए है क्योंकि सदस्य पॉइंटर्स पूरी तरह से संरचित हैं। यदि आप चाहते हैं, तो आप कह सकते हैं कि वे किसी अन्य पता स्थान पर रहते हैं (और फिर कारण वही है जैसा कि आप 'शून्य *' का उपयोग करके किसी फ़ंक्शन को इंगित नहीं कर सकते हैं)। आकारों के लिए, जीसीसी (इटेनियम एबीआई के बाद) पर एक डेटा सदस्य पॉइंटर के पास 'ptrdiff_t' का आकार होगा - यह मेरे पीसी पर' int * 'के आकार के बराबर होगा - पता स्थान प्रारंभ की शुरुआत से ऑफसेट है अपने अंतिम सदस्य ऑफ़सेट पर ऑब्जेक्ट करें। सदस्य कार्यों के लिए पॉइंटर्स के लिए, आकार के अलावा, आमतौर पर आकार बड़ा होता है। –

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