2015-11-23 11 views
11

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* वैध है, और इन गणनाओं कर के पसंदीदा तरीका है?

उत्तर

2

आप चाहिए उपयोग char*: कुछ करने के लिए एक सूचक है कि एक int8_t नहीं है पर int8_t* के साथ एक reinterpret_cast के प्रयोग पर व्यवहार अपरिभाषित है। char* पर कास्टिंग नियम के अपवाद के रूप में देखा जा सकता है।

पूर्व सी 14 ++, char 127 के लिए रेंज -127 के साथ एक 1 के पूरक प्रकार हो सकता है। int8_t 2 का पूरक होना चाहिए। यहां तक ​​कि सी ++ 14 और बाद में, मैं नहीं देख सकता कि प्रकार क्यों संबंधित हैं: char अभी भी एक हस्ताक्षरित या हस्ताक्षरित प्रकार हो सकता है।

+0

सूचक आकार के बारे में, मैंने सोचा था कि वस्तुओं के लिए सभी संकेत सी में एक ही आकार था ++। क्या इसकी गारंटी नहीं है? लेकिन जो कुछ भी जवाब है, पॉइंटर अंकगणित 'आकार (टी)' से प्रभावित होता है, न कि आकार (टी *) '। किसी भी दर पर, एलियासिंग के बारे में बिंदु खड़ा है। –

+0

आपका अंतिम बिंदु सही है: आकार (*) प्रासंगिक नहीं है इसलिए मैंने इसे हटा दिया है क्योंकि यह केवल उत्तर को कमजोर करता है। आपके पहले बिंदु के लिए, मैं नहीं देख सकता कि ऑब्जेक्ट्स के पॉइंटर्स प्रासंगिक क्यों हैं। हमारे पास केवल पीओडी हैं। – Bathsheba

+1

पहला पैराग्राफ में से कोई भी सत्य नहीं है। 'uint8_t' वास्तव में सख्त एलियासिंग नियम में विशेष अनुमति का हिस्सा नहीं है, लेकिन पॉइंटर का उपयोग यहां दंडित करने के लिए नहीं किया जा रहा है, केवल पॉइंटर अंकगणितीय के लिए। पॉइंटर अंकगणितीय के लिए नियम अधिक अनुमोदित हैं, और केवल इतना आवश्यक है कि संरेखण उपयुक्त है और अंकगणित आपको एक ही पूर्ण वस्तु से बाहर नहीं ले जाता .... और वहां 'char *' के लिए कोई विशेष अनुमति नहीं है। –

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