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
Post a Comment