in C e C++ valori lingue di matrice tipo T [N]
sono implicitamente convertiti in valori di tipo puntatore T *
nella maggior parte dei contesti (con poche eccezioni). Il puntatore risultante punta al primo elemento dell'array originale (indice 0). Questo fenomeno è noto informalmente come decadimento del tipo di matrice .
L'argomento printf
è uno di questi contesti quando si verifica il decadimento del tipo di matrice .
array A 2D di tipo int [5][5]
non è altro che una "matrice 1D di array 1D", cioè esso è un array di 5 elementi e ogni elemento stesso essendo un array di 5 int
s.
La regola di decadimento del tipo di matrice sopra si applica naturalmente a questa situazione.
L'espressione a
, che in origine ha il tipo di matrice int [5][5]
, decade a un puntatore del tipo int (*)[5]
. Il puntatore punta all'elemento a[0]
, che è l'inizio della sottoschera a[0]
in memoria. Questo è il primo puntatore che stampi.
L'espressione *a
è un operatore di dereferenza applicato alla sottoespressione a
. La sottoespressione a
in questo contesto si comporta esattamente nello stesso modo di prima: decade al puntatore del tipo int (*)[5]
che punta a a[0]
. Quindi il risultato di *a
è a[0]
stesso. Ma a[0]
è anche un array. È un array di tipo int[5]
.È anche soggetto al decadimento del tipo di array. Decade per puntatore di tipo int *
, che punta al primo elemento di a[0]
, ad esempio a[0][0]
. Questo è il secondo puntatore che stampi.
La ragione per cui entrambi i valori dei puntatori sono gli stessi numericamente è che l'inizio della sottoschera a[0]
corrisponde alla stessa posizione di memoria dell'elemento a[0][0]
.
C o C++? Cose diverse – yizzlez
In effetti, è perché l'indirizzo di 'a' e il valore contenuto in' * a' sono gli stessi. –