मैं Ogre3D कार्यान्वयन में कुछ कोड पढ़ रहा हूं और मुझे समझ में नहीं आता कि void *
प्रकार परिवर्तनीय माध्यम क्या है। C12+ में void
का सूचक क्या है?सी ++ में शून्य करने के लिए सूचक?
उत्तर
एक सूचक शून्य करने के लिए, void*
किसी भी वस्तु को इंगित कर सकते हैं:
int a = 5;
void *p = &a;
double b = 3.14;
p = &b;
आप कर सकते हैं नहीं भिन्नता, वेतन वृद्धि या घटती है कि सूचक है, क्योंकि आप आप किस प्रकार को इंगित पता नहीं है। विचार यह है कि void*
का उपयोग memcpy
जैसे कार्यों के लिए किया जा सकता है जो कि बस स्मृति ब्लॉक को प्रतिलिपि बनाते हैं, और उनकी प्रतिलिपि के प्रकार की परवाह नहीं करते हैं।
यह स्मृति में एक स्थान के लिए एक कच्चा सूचक है। यह किसी भी पॉइंटर अंकगणित जैसे char * या int * की अनुमति नहीं देता है।
यहाँ उपयोग
यह सिर्फ एक सामान्य सूचक है, जब आप प्रकार पता नहीं है डेटा पास करने के लिए प्रयोग किया जाता है के कुछ उदाहरण हैं। इसका उपयोग करने के लिए आपको इसे सही प्रकार पर डालना होगा।
यह कुछ भी पर एक सूचक है - बस एक स्मृति का एक हिस्सा जिसे आप खेल सकते हैं - एक वस्तु हो सकती है, एक char हो सकती है। आपको इसके साथ कुछ भी उपयोगी करने के लिए डालना है।
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 का उपयोग कर खबरदार और।)
एक शून्य सूचक एक वर्ग के सदस्य को इंगित नहीं कर सकते सी ++ में।
यह सही है, वे अलग-अलग आकार के पॉइंटर्स हैं। – Joshua
मुझे लगता है कि ऐसा इसलिए है क्योंकि सदस्य पॉइंटर्स पूरी तरह से संरचित हैं। यदि आप चाहते हैं, तो आप कह सकते हैं कि वे किसी अन्य पता स्थान पर रहते हैं (और फिर कारण वही है जैसा कि आप 'शून्य *' का उपयोग करके किसी फ़ंक्शन को इंगित नहीं कर सकते हैं)। आकारों के लिए, जीसीसी (इटेनियम एबीआई के बाद) पर एक डेटा सदस्य पॉइंटर के पास 'ptrdiff_t' का आकार होगा - यह मेरे पीसी पर' int * 'के आकार के बराबर होगा - पता स्थान प्रारंभ की शुरुआत से ऑफसेट है अपने अंतिम सदस्य ऑफ़सेट पर ऑब्जेक्ट करें। सदस्य कार्यों के लिए पॉइंटर्स के लिए, आकार के अलावा, आमतौर पर आकार बड़ा होता है। –
- 1. (शून्य) सी में सूचक/C++
- 2. सी Dereference शून्य * सूचक
- 3. सी ++ में शून्य सूचक क्या है?
- 4. सी #: सूचक दोगुना करने के लिए
- 5. शून्य सूचक और शून्य सूचक के बीच क्या अंतर है?
- 6. सी: शून्य सूचक से प्रकार Extrapolating
- 7. यूनियन बनाम शून्य सूचक
- 8. जब सी में सूचक मुक्त करने के लिए और कैसे पता करने के लिए अगर यह
- 9. शून्य सूचक अंकगणितीय
- 10. सी ++: एक सदस्य सूचक को शून्य करने के लिए शुरू करें?
- 11. उद्देश्य-सी में सूचक में सूचक?
- 12. एक संरचना के लिए एक शून्य सूचक कास्टिंग
- 13. शून्य * सूचक में समस्या का संदर्भ?
- 14. View.getDrawingCache() में शून्य सूचक से कैसे बचें?
- 15. शून्य * बनाम चार * सूचक अंकगणित
- 16. इटरेटर शून्य सूचक के बराबर है?
- 17. सिंटेक्स सी (या सी ++) में एक सूचक dereferencing के लिए
- 18. शून्य सूचक अपवाद प्रारंभिक सेवा
- 19. सूचक अंकगणित सी में
- 20. सूचक के लिए सम्मेलन *
- 21. एंड्रॉयड: this.getApplication() रिटर्न शून्य सूचक
- 22. सी #: सूचक प्रकार के रूप में सूचक प्रकार का उपयोग?
- 23. ऑब्जेक्टिव-सी के लिए ... सूचक विधि
- 24. क्या यह एक शून्य शून्य * सूचक को हटाने के लिए अपरिभाषित व्यवहार है?
- 25. सी ++ स्थिर विधि के लिए कास्ट सूचक
- 26. एंड्रॉइड glsurfaceview शून्य सूचक अपवाद
- 27. सी संरचना के लिए सूचक - सेगमेंटेशन गलती
- 28. कार्यों के लिए ++ सूचक सी, शुरुआती प्रश्न
- 29. "शून्य सूचक असाइनमेंट त्रुटि" क्या है?
- 30. सी में एक विशिष्ट स्मृति पता ++ के लिए सूचक को प्रारंभ करने के लिए कैसे
वाउ - मुझे एहसास नहीं हुआ कि आप एक शून्य * बढ़ा नहीं सकते! धन्यवाद! – xtofl
काफी कुछ कंपाइलर्स आपको देंगे - वे मानते हैं कि सभी सूचक प्रकार 32 बिट हैं। यह गलत है लेकिन विंडोज़ पर आम है जहां लोग 32 बिट x86 मानते हैं। –
@ एमजीबी: कभी ऐसा कंपाइलर कभी नहीं देखा। – dalle