पॉइंटर्स सिद्धांत रूप में विभिन्न आकारों में हो सकते हैं। सबसे बड़ा पॉइंटर, यदि कोई अंतर है (सदस्य पॉइंटर्स को अनदेखा करना, वास्तविक पॉइंटर्स के बारे में बात करना) char*
है, तो char
परिभाषा के अनुसार एक बाइट है और कहीं भी, कोई संरेखण नहीं हो सकता है। void*
char*
का प्रतिनिधित्व करने में सक्षम होना चाहिए।
int*
के साथ char*
की तुलना में कम बिट्स का उपयोग कर सिस्टम पर, उस दिशा में पुन: व्याख्या-कास्टिंग थोड़ा जोखिम भरा हो सकता है।
मुझे लगता है कि इन पॉइंटर्स (हे) के साथ आप इसे मानक में पा सकते हैं। void*
किसी भी सूचक के लिए पर्याप्त होने के बारे में आवश्यकता है, और संरेखण के बारे में बात: कठोर/बड़ा, उस प्रकार के सूचक के लिए आवश्यक कम बिट्स। लेकिन मैंने कभी भी किसी भी मौजूदा प्रणाली के बारे में नहीं सुना है जहां ऐसा अंतर है।
का प्रतिनिधित्व करने में सक्षम होने के बारे में void*
Standardese char*
:
सी ++ 11 §3.9.2/4:
”
एक संकेतक सीवी -qualified को (3.9.3) या सीवी -unqualified void
का उपयोग किया जा सकता है अज्ञात प्रकार की वस्तुओं को इंगित करने के लिए । ऐसा सूचक कोई ऑब्जेक्ट पॉइंटर रखने में सक्षम होगा।के प्रकार सीवीvoid*
एक वस्तु सीवी के रूप में ही प्रतिनिधित्व और संरेखण आवश्यकताओं होगाchar*
“ किसी भी वस्तु सूचक ” थोड़ा तात्पर्य सूचक के विभिन्न आकारों देखते हैं कि।
सी ++ 11 §5.2.10/7:
”
एक वस्तु सूचक स्पष्ट रूप से एक वस्तु में बदला जा सकता
दिग्दर्शन के संरेखण के बारे में Standaredese एक अलग प्रकार के सूचक। एक prvalue "T1
सूचक" प्रकार के v
"सीवी सूचकT2
" प्रकार में बदल जाती है, तो परिणाम is static_cast<
सीवीT2*>(static_cast<
सीवीvoid*>(v))
अगर दोनों T1
और T2
मानक लेआउट प्रकार (3.9) कर रहे हैं और संरेखण T2
की आवश्यकताओं T1
की तुलना में कोई कठोर नहीं है, या यदि कोई प्रकार void
है। प्रकार के prvalue परिवर्तित (जहां T1
और T2
वस्तु प्रकार के होते हैं और जहां T2
के संरेखण आवश्यकताओं कोई T1
की से अधिक सख्त कर रहे हैं) "T2
सूचक" और वापस अपने मूल प्रकार की पैदावार के लिए प्रकार को "T1
सूचक" मूल सूचक मूल्य। ऐसे किसी अन्य सूचक रूपांतरण का नतीजा अनिर्दिष्ट है। लायक टिप्पण मानक में वर्ग व्युत्पत्ति के सी-शैली अनुकरण, कि जाहिरा तौर पर ऊपर अंत में “ किसी अन्य ” के विपरीत है के लिए कुछ समर्थन है कि बाद में वहाँ
यह ’ रों:
सी ++ 11 §9.2/20,
”
एक मानक लेआउट struct वस्तु के लिए एक सूचक, उपयुक्त रूप से एकका उपयोग कर परिवर्तित 210, इसके प्रारंभिक सदस्य (या यदि वह सदस्य थोड़ा-फ़ील्ड है, तो उस इकाई में जहां यह रहता है) और इसके विपरीत।
इस मामले दो वस्तुओं जरूरी एक ही संरेखण है, जबकि पिछले उद्धृत पैरा केवल प्रकार – के संरेखण लेकिन स्पष्ट रूप से औपचारिक थोड़ा विरोधाभास के बारे में बात एक व्यावहारिक समस्या है, के रूप में मैं इसे देख नहीं है।
हैं ऐसा कोई मंच नहीं है, तो इस सवाल का जवाब देना मुश्किल होगा, क्योंकि मुझे संदेह है कि ऐसे लोग हैं जो आत्मविश्वास से कह सकते हैं कि "ऐसा कोई मंच नहीं है, मैं उन्हें सब जानता हूं"। हालांकि, एक पूरी तरह से hypothetical उदाहरण के रूप में, एक मशीन हो सकती है, जिसके लिए एन-बाइट मेमोरी संरेखण की आवश्यकता होती है, और पॉइंटर मूल्यों में अतिरिक्त बिट्स होती हैं, और उन बिट्स का उपयोग कुछ अतिरिक्त जानकारी को एन्कोड करने के लिए करती है, जो 'फ्लोट *' और 'int' के लिए अलग होती हैं। * '। तो यदि मानक बदलते बिट पैटर्न की अनुमति नहीं देगा, तो उस वास्तुकला पर कलाकार असंभव होगा। – hyde