2011-10-13 16 views
8

लिए तो मेरे पास है एक सरणी इस तरह की घोषणा की:sizeof सूचक सरणी

int a[3][2]; 

तो क्यों है:

sizeof(a+0) == 8 

जबकि:

sizeof(a) == 24 

मैं कैसे जोड़ने समझ में नहीं आता सूचक के लिए 0 sizeof आउटपुट बदलता है। क्या शायद कुछ अंतर्निहित प्रकार कास्ट हो सकता है?

उत्तर

12

यदि आप जोड़ने 0a, तो a पहले प्रकार int(*)[2] (प्रकार int[3][2] की एक सरणी के पहले तत्व की ओर इशारा करते) के एक सूचक मूल्य में बदल जाती है। उसके बाद 0 उसमें जोड़ा गया है, जो उस सूचक मूल्य से प्रतिनिधित्व किए गए पते पर 0 * sizeof(int[2]) बाइट जोड़ता है। चूंकि वह गुणा 0 उत्पन्न करता है, यह वही सूचक मूल्य उत्पन्न करेगा। चूंकि यह एक सूचक है, sizeof(a+0) एक सूचक का आकार उत्पन्न करता है, जो आपके बॉक्स पर 8 बाइट्स है।

आप sizeof(a) करते हैं, वहाँ संकलक एक सूचक मूल्य के लिए a कन्वर्ट करने के लिए कोई कारण नहीं है (कि केवल समझ में आता है अगर आप सूचकांक तत्वों करना चाहते हैं या सूचक तत्वों का पता शामिल गणित करने के लिए) है। तो अभिव्यक्ति a एक सरणी प्रकार का रहता है, और आपको int(*)[2] के आकार के बजाय int[3][2] का आकार मिलता है। तो, 3 * 2 * sizeof(int) जो आपके बॉक्स पर 24 बाइट्स है।

आशा है कि यह चीजों को स्पष्ट करे।

+0

कॉलिंग 'आकार (ए +0)' कॉलिंग 'आकार (एक [0])' जैसा ही है, जो सरणी में पहले 'int [2] 'तत्व का आकार ले रहा है, इसलिए' sizeof (int) * 2 = 8'। यह एक सूचक का आकार नहीं ले रहा है। –

+0

@ रेमी मैं इस बात की सराहना करता हूं कि क्या आप उस सिद्धांत को तैयार करेंगे और इसे पेपर –

+2

@ रेमीलेबेउ-टीमबी के रूप में पोस्ट करेंगे: 'एक [0]' '(ए + 0)' के बराबर है, '(ए +0)' । –

0

sizeof आपको अभिव्यक्ति के प्रकार का आकार बताता है। जब आप 0a जोड़ते हैं, तो यह प्रकार एक पॉइंटर (64-बिट सिस्टम पर 8 बाइट) बन जाता है।

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