p
è un puntatore a un array di 3 elementi simili:
┌─────┬─────┬─────┐
│ │ │ │
└─────┴─────┴─────┘
^
└─ p
noti che indica l'intero array, non un singolo elemento di essa.
L'espressione *p[i]
viene considerata come *(p[i])
a causa della precedenza dell'operatore (che equivale a *(*(p + i))
). Ciò significa che stai indicizzando il puntatore all'array. Se lo fai p[1]
, per esempio, si sposta il puntatore lungo alla matrice "next" e tentare di dereferenziarlo:
┌─────┬─────┬─────┐
│ │ │ │
└─────┴─────┴─────┘
^
└─ p + 1
Come possiamo vedere, non c'è niente, e si otterrà un comportamento indefinito. Tuttavia, quando si esegue (*p)[i]
(equivalente a *((*p) + i)
), ci si assicura che il dereferenziamento avvenga prima. La dereferenzia ci fornisce la matrice stessa, che può quindi essere convertita implicitamente dalla conversione da matrice a puntatore a un puntatore al primo elemento delle matrici. Quindi, quello che si ottiene è:
┌─────┬─────┬─────┐
│ │ │ │
└─────┴─────┴─────┘
^
└─ *p
In questo caso, il puntatore sta indicando la matrice elemento e non l'intero array. Se poi si indice, per esempio, (*p)[1]
, si otterrà:
┌─────┬─────┬─────┐
│ │ │ │
└─────┴─────┴─────┘
^
└─ (*p) + 1
Questo vi dà una valida const char*
che possono poi essere restituito dal cout
.
fonte
2013-04-15 11:03:23
Ottima risposta. Non mi ero reso conto che aumentando avrei cercato di dereferire un altro insieme, anche se ero consapevole della precedenza degli operatori. Devo essere bloccato nella mentalità di un array come puntatore. – thelittlegumnut