this answer में offsetof, int8_t*
(बाइट) सूचक अंकगणित के लिए प्रयोग किया जाता है:सी ++ चार * अंकगणित
std::size_t offset = offsetof(Thing, b);
Thing* thing = reinterpret_cast<Thing*>(reinterpret_cast<int8_t*>(ptr) - offset);
मैं हमेशा अतीत में char*
का उपयोग किया है लेकिन टिप्पणी वास्तव में भ्रमित कर रहे हैं, और कोई भी जवाब दिया, तो मैं इस अलग सवाल पोस्ट किया।
char*
वैध है, और इन गणनाओं कर के पसंदीदा तरीका है?
सूचक आकार के बारे में, मैंने सोचा था कि वस्तुओं के लिए सभी संकेत सी में एक ही आकार था ++। क्या इसकी गारंटी नहीं है? लेकिन जो कुछ भी जवाब है, पॉइंटर अंकगणित 'आकार (टी)' से प्रभावित होता है, न कि आकार (टी *) '। किसी भी दर पर, एलियासिंग के बारे में बिंदु खड़ा है। –
आपका अंतिम बिंदु सही है: आकार (*) प्रासंगिक नहीं है इसलिए मैंने इसे हटा दिया है क्योंकि यह केवल उत्तर को कमजोर करता है। आपके पहले बिंदु के लिए, मैं नहीं देख सकता कि ऑब्जेक्ट्स के पॉइंटर्स प्रासंगिक क्यों हैं। हमारे पास केवल पीओडी हैं। – Bathsheba
पहला पैराग्राफ में से कोई भी सत्य नहीं है। 'uint8_t' वास्तव में सख्त एलियासिंग नियम में विशेष अनुमति का हिस्सा नहीं है, लेकिन पॉइंटर का उपयोग यहां दंडित करने के लिए नहीं किया जा रहा है, केवल पॉइंटर अंकगणितीय के लिए। पॉइंटर अंकगणितीय के लिए नियम अधिक अनुमोदित हैं, और केवल इतना आवश्यक है कि संरेखण उपयुक्त है और अंकगणित आपको एक ही पूर्ण वस्तु से बाहर नहीं ले जाता .... और वहां 'char *' के लिए कोई विशेष अनुमति नहीं है। –