2014-11-07 12 views
10
#include <iostream> 

int main() 
{ 
    int a[3][3] = {{22, 33, 44}, {55, 66, 77}, {88, 99, 100}}; 
    std::cout << a[1] << '\n' << a + 1 << '\n' << *(a + 1); 
} 
0x0013FF68 
0x0013FF68 
0x0013FF68 

क्यों a+1 == *(a+1) करता है?इस उदाहरण में एक + 1 == * (ए + 1) क्यों है?

+0

यह मदद कर सकता है: http://www.fredosaurus.com/notes-cpp/arrayptr/23two-dim-array-memory-layout.html –

+4

@AndyG, '* (अ + 1)' 'एक [1]' है, न कि एक [1] [0] '। –

उत्तर

15

a + 1a में दूसरा तत्व का पता है और यह भी &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)); 
संबंधित मुद्दे