c++ - How does this pointer arithmetic work? -


<पूर्व> #include & lt; stdio.h & gt; Int मुख्य (शून्य) {एक हस्ताक्षरित [3] [4] = {{2,23,6,7}, {8,5,1,4}, {12,15,3,9}}; printf ( "% u", * ((int *) (((चार *) क) 4))); वापसी 0; }

मेरी मशीन का आउटपुट a [0] [1] यानी 23 पर मान है। क्या कोई बता सकता है कि कैसे यह काम कर रहा है?

संपादित करें: पुराने yucky कोड पर वापस रोलिंग, वास्तव में मुझे क्या प्रस्तुत किया गया था: पी

इसलिए आपके पास मेमोरी में अपनी सरणी है:

  2, 23, 6, 7, 8 ...  < / प्री> 

यह क्या करता है जो चार * में सरणी डाल देता है, जिससे आपको व्यक्तिगत बाइट्स का उपयोग करने की सुविधा मिलती है, और यह यहां इंगित करता है:

  2, 23 , 6, 7, 8 ... ^  

यह फिर चार बाइट जोड़ता है, इसे अगले मूल्य पर ले जाता है (और बाद में इस पर अधिक)।

  2, 23, 6, 7, 8 ... ^  

फिर यह इसे एक int * में बदल देता है और इसे मानता है, मान 23 हो रही है। < / P>


इस कोड में तकनीकी रूप से तीन चीजें गलत हैं।

पहला यह मानता है कि एक अहस्ताक्षरित आकार में 4 बाइट्स है (इसलिए + 4 )। लेकिन यह जरूरी नहीं कि सच है! बेहतर होता है + sizeof (अहस्ताक्षरित) , सही सुनिश्चित करने के लिए चाहे जो भी आकार अहस्ताक्षरित होता है।

दूसरी समस्या < कोड> int : मूल सरणी अस्वाभाविक थी, लेकिन मान को int पर डाला जा रहा है। अहस्ताक्षरित श्रेणी में मान मौजूद नहीं है जो कि int का प्रतिनिधित्व नहीं कर सकता (क्योंकि int में सीमा का आधा नकारात्मक है।) इसलिए यदि कोई सरणी में मानों का एक int (जिसका अर्थ मान INT_MAX से अधिक था) के रूप में प्रदर्शित नहीं किया गया था, तो आपको गलत मान मिलेगा सही प्रकार को बनाए रखने के लिए अहस्ताक्षरित * में कन्वर्ट करने के लिए बेहतर होगा।

अंतिम बात प्रारूप विनिर्देशक है पूर्णांक के लिए विनिर्देशक % d है, लेकिन कोड का उपयोग % u है, जो अहस्ताक्षरित पूर्णांक के लिए है असल में, int * पर वापस कास्ट करना गलत था, printf को उस मूल्य को अहस्ताक्षरित * में वापस भेज दिया गया है < / कोड>, इसे अखंडता बहाल करना समस्या दो को फिक्स करके, समस्या तीन को खुद तय करता है।

एक छिपी चौथी समस्या है: कोड बेकार है। यह सीखने के लिए हो सकता है, लेकिन युक


Comments