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

Perché a+1 == *(a+1)?Perché un + 1 == * (a + 1) in questo esempio?

+0

Questo potrebbe aiutare: http://www.fredosaurus.com/notes-cpp/arrayptr/23two-dim-array-memory-layout.html –

+4

@AndyG, '* (a + 1)' è 'a [1]', non 'a [1] [0]'. –

risposta

15

a + 1 è l'indirizzo del secondo elemento in a e potrebbe anche essere scritta come &a[1] (che è equivalente a &*(a + 1) per definizione).

*(a + 1) è un lvalue che si riferisce al secondo array. È equivalente a a[1] per definizione.
Proprio come con qualsiasi altro array per il decadimento del puntatore, questo lvalue decade in un puntatore al primo elemento dell'array a cui fa riferimento, vale a dire decade a &a[1][0]. Ma questo è equivalente all'indirizzo di quell'oggetto matrice stesso. Quindi il valore è lo stesso di quello di &a[1] ... che è esattamente come abbiamo definito il valore dell'espressione a + 1 sopra.

Si noti che l'array è decaduto su un puntatore perché la corrispondenza migliore per il secondo inserimento è operator<<(void const*). Si consideri

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