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));
Dies könnte helfen: http://www.fredosaurus.com/notes-cpp/arrayptr/23two-dim-array-memory-layout.html –
@AndyG, '* (a + 1)' ist 'a [1]', nicht 'a [1] [0]'. –