lorenzosax ha scritto:
Ma in memoria vengono allocate allo stesso modo?
Ovviamente no.
Se scrivi
mat[3][3]
allora avrai in memoria, sequenzialmente, a partire dall'indirizzo individuato da mat (mat è un puntatore), i valori
1 2 3 4 5 6 7 8 9
(naturalmente se parliamo di interi a 32 bit, ognuno occuperà 4 byte).
Nell'altro caso
int **mat;
in memoria avrai un vettore che inizia dall'indirizzo individuato da mat, contenente 3 puntatori a intero memorizzati in sequenza, che esemplifico così
<punt1><punt2><punt3>
A partire dall'indirizzo individuato dal puntatore <punt1> avrai, in sequenza, gli interi
1 2 3
A partire da <punt2> avrai
4 5 6
A partire da <punt3> avrai
7 8 9
Nota che i tre puntatori possono puntare ovunque in memoria e non c'è nessuna relazione tra loro (almeno, non prevedibile).
Ci pensa il compilatore a fare i calcoli per generare indici e istruzioni macchina corrette per puntare agli elementi corretti se tu accedi nella forma [][]