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));
Questo potrebbe aiutare: http://www.fredosaurus.com/notes-cpp/arrayptr/23two-dim-array-memory-layout.html –
@AndyG, '* (a + 1)' è 'a [1]', non 'a [1] [0]'. –