ठीक है, वे अलग-अलग चीजें हैं। arr
आपके सरणी के पहले तत्व को पॉइंटर के अधिकांश संदर्भों में क्षय - इसका मतलब है कि आपके 2 डी सरणी में पहली 3-तत्व पंक्ति में पॉइंटर: int (*)[3]
टाइप करें। arr + 1
, फिर, सरणी में दूसरी पंक्ति को इंगित करता है।
&arr
सरणी का पता है (int (*)[3][3]
टाइप करें), इसलिए &arr + 1
आपके 2 डी सरणी की पूरी तरह से अंत में स्मृति के लिए अंक को इंगित करता है।
आप अलग-अलग प्रिंट करके आसानी से इस व्यवहार की पुष्टि कर सकते हैं। विशेष रूप से, मूल्यों की बजाय नए पॉइंटर्स को ऑफ़सेट प्रिंट करना स्वयं चीजों को स्पष्ट करने में मदद करेगा। इन प्रिंट बयानों से अपने कार्यक्रम से उत्पादन:
printf("%ld\n",(intptr_t)(&arr+1) - (intptr_t)arr);
printf("%ld\n",(intptr_t)(arr+1) - (intptr_t)arr);
क्रमशः &arr+1
और arr+1
को दशमलव ऑफसेट होगा।
36
12
36 मैचों अप: 3 पंक्तियों × 3 कॉलम प्रविष्टि प्रति × 4 बाइट्स = 36 बाइट्स यहाँ एक परीक्षण रन से उत्पादन मैं बस हो गया है। तो 12: 1 पंक्ति × 3 कॉलम × 4 बाइट प्रति प्रवेश = 12 बाइट्स करता है।
नोट - आप %d
का उपयोग कर पॉइंटर्स प्रिंटिंग भी कर रहे हैं, जो गलत है। इसके लिए आपको शायद %p
का उपयोग करना चाहिए।
स्रोत
2012-08-08 04:37:53
के अगले सरणी के पता देता है मैं अपने जवाब से बहुत कुछ सीखा देता है। धन्यवाद। –
'% p' के साथ, आपको पॉइंटर्स को 'शून्य *' पर डालना होगा। –