a + 1
jest adres drugiego elementu a
i może także być zapisana jako &a[1]
(co jest równoważne &*(a + 1)
definicji).
*(a + 1)
to lwartość odnosząca się do drugiej macierzy. Z definicji jest to odpowiednik a[1]
.
Podobnie jak w przypadku każdej innej tablicy do zaniku wskaźnika, ta luminacja zanika do wskaźnika do pierwszego elementu tablicy, do której się odnosi, tj. Zanika do &a[1][0]
. Jest to jednak odpowiednik adresu tego obiektu tablicy. Tak więc wartość jest taka sama jak w przypadku wartości &a[1]
... co jest dokładnie tym, jak zdefiniowaliśmy powyżej wartość wyrażenia a + 1
.
Należy zauważyć, że tablica uległa rozkładowi do wskaźnika, ponieważ najlepiej pasuje do drugiego wstawienia: operator<<(void const*)
. Rozważmy
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));
To może pomóc: http://www.fredosaurus.com/notes-cpp/arrayptr/23two-dim-array-memory-layout.html –
@AndyG, '* (a + 1)' to 'a [1]', a nie 'a [1] [0]'. –