हम को परिवर्तित करके T
के किसी ऑब्जेक्ट का प्रतिनिधित्व देख सकते हैं जो उस ऑब्जेक्ट को char*
में इंगित करता है। व्यवहार में कम से कम: ff 01 00 00
:चार सूचक को कब और कैसे रूपांतरण की अनुमति है?
int x = 511;
unsigned char* cp = (unsigned char*)&x;
std::cout << std::hex << std::setfill('0');
for (int i = 0; i < sizeof(int); i++) {
std::cout << std::setw(2) << (int)cp[i] << ' ';
}
यह मेरा प्रणाली पर 511
के प्रतिनिधित्व आउटपुट।
(निश्चित रूप से) कुछ कार्यान्वयन परिभाषित व्यवहार यहां होता है। कौन से कास्ट मुझे int*
को unsigned char*
में परिवर्तित करने की अनुमति दे रहे हैं और कौन से रूपांतरण उस कलाकार को लागू करते हैं? क्या मैं जल्द से जल्द अपरिभाषित व्यवहार का आह्वान कर रहा हूं? क्या मैं इस तरह के T*
टाइप कर सकता हूं? ऐसा करने पर मैं भरोसा कैसे कर सकता हूं?
मैं इसे अपरिभाषित व्यवहार है नहीं लगता है, कम से कम यदि आप डेटा को संशोधित नहीं करते हैं।लेकिन परिणाम इस बात पर निर्भर करेगा कि क्या आप प्लेटफॉर्म छोटा या बड़ा एंडियन है या नहीं। – Synxis
ध्यान दें कि यह केवल 'char *' के लिए सुरक्षित है। विभिन्न प्रकार के रूप में पढ़ने के लिए पॉइंटर्स कास्टिंग * एलियासिंग * के साथ समस्याएं पैदा करता है। सी और सी ++ भाषाएं संकलक को गारंटी देती हैं कि विभिन्न प्रकार के पॉइंटर्स कभी भी एक ही ऑब्जेक्ट को इंगित नहीं कर सकते हैं, इसलिए ऑप्टिमाइज़र एक रजिस्टर में मूल्य को स्टोर करने या लोड को उठाने या लूप से लिखने जैसी चीज़ें कर सकता है। 'char *' एकमात्र अपवाद है। डिस्क और नेटवर्क बफर से और से क्रमबद्ध करने के कारण, 'char *' को किसी भी चीज़ के साथ उपनाम माना जाना चाहिए। –
@ZanLynx - पुनः "' char * 'एकमात्र अपवाद है": बिल्कुल नहीं। मानक 'हस्ताक्षरित चार *' में रूपांतरण की अनुमति भी देता है। –