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

Dlaczego a+1 == *(a+1)?Dlaczego a + 1 == * (a + 1) w tym przykładzie?

+0

To może pomóc: http://www.fredosaurus.com/notes-cpp/arrayptr/23two-dim-array-memory-layout.html –

+4

@AndyG, '* (a + 1)' to 'a [1]', a nie 'a [1] [0]'. –

Odpowiedz

15

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)); 
Powiązane problemy