a + 1
a
में दूसरा तत्व का पता है और यह भी &a[1]
(जो परिभाषा द्वारा &*(a + 1)
के बराबर है) के रूप में लिखा जा सकता है।
*(a + 1)
दूसरी सरणी का जिक्र है। यह परिभाषा के अनुसार a[1]
के बराबर है।
पॉइंटर क्षय के किसी भी अन्य सरणी की तरह ही, यह अंतराल उस सरणी के पहले तत्व को पॉइंटर को अस्वीकार करता है, जिसका अर्थ है कि यह &a[1][0]
पर है। लेकिन यह उस सरणी वस्तु के पते के बराबर है। तो मान &a[1]
जैसा ही है ... यह ठीक है कि हमने उपरोक्त a + 1
अभिव्यक्ति के मूल्य को कैसे परिभाषित किया है।
ध्यान दें कि सरणी एक सूचक को क्षीण कर दिया गया है क्योंकि दूसरे सम्मिलन के लिए सबसे अच्छा मिलान operator<<(void const*)
है। पर विचार करें
int (*p1)[3] = a + 1;
int (&p2)[3] = *(a + 1); // We could also have written *p1
int* p3 = p2; // The array-to-pointer decay
assert(static_cast<void*>(p1) == static_cast<void*>(p3));
यह मदद कर सकता है: http://www.fredosaurus.com/notes-cpp/arrayptr/23two-dim-array-memory-layout.html –
@AndyG, '* (अ + 1)' 'एक [1]' है, न कि एक [1] [0] '। –