2014-11-07 20 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 

Warum a+1 == *(a+1)?Warum ist a + 1 == * (a + 1) in diesem Beispiel?

+0

Dies könnte helfen: http://www.fredosaurus.com/notes-cpp/arrayptr/23two-dim-array-memory-layout.html –

+4

@AndyG, '* (a + 1)' ist 'a [1]', nicht 'a [1] [0]'. –

Antwort

15

a + 1 ist die Adresse des zweiten Elements in a und auch als &a[1] geschrieben werden könnte (was definitions &*(a + 1) äquivalent ist).

*(a + 1) ist ein Wert, der sich auf das zweite Array bezieht. Es entspricht per Definition a[1].
Genau wie bei jedem anderen Array zum Verfall des Zeigers zerfällt dieser L-Wert in einen Zeiger auf das erste Element des Arrays, auf das er sich bezieht, d. H. Er fällt zu &a[1][0]. Aber das entspricht der Adresse dieses Array-Objekts. Also ist der Wert der gleiche wie der von &a[1] ... genau wie wir den Wert des Ausdrucks a + 1 oben definiert haben.

Beachten Sie, dass das Array zu einem Zeiger verfallen ist, da die beste Übereinstimmung für die zweite Insertion operator<<(void const*) ist. Betrachten

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)); 
Verwandte Themen