Originariamente inviato da zuffff
Devo allocare dinamicamente una matrice di interi;
perchè non è possibile farlo in questo modo?:

int **p;

p=new int[5][5];

grazie
Perché sono 2 tipi completamente diversi! Puoi usare int **p per un array bidimensionale di interi ma l'allocazione è da fare in modo completamente diverso.

Esempio:
codice:
int i;
int **matrice;

matrice = new int*[5];

for (i = 0; i < 5; i++)
    matrice[i] = new int[5];
Dichiarando int **matrice, si dichiara "un puntatore a puntatore a int". Questo vuol dire che l'unico modo per avere così un array bidimensionale, è quello di creare "un array di array". Con la prima new alloco un array di puntatori ad int. Con le successive N new alloco N array di interi. In questo modo matrice[i][j] si comporta proprio come volevi.

Mentre invece int matrice[5][5] è una cosa molto diversa. Intanto solo questo è il vero array bidimensionale come inteso dal "C", cioè un insieme contiguo di elementi. Quello di prima è "un array di array", cioè un semplice array in cui ogni elemento punta ad un altro array.

Se provi a compilare il tuo codice, otterresti un errore di questo tipo:

cannot convert `int (*)[5]' to `int**' in assignment

I due tipi sono molto diversi. Dichiarando int matrice[5][5], per accedere ad una cella [i][j], il compilatore produce un qualcosa del tipo:

*(((int*) matrice) + i*5 + j)

Che è quindi ben diverso dal dereferenziare 2 volte un puntatore **.

Spero di aver spiegato bene la questione.