Dichiarare un puntatore all’array multidimensionale e allocare l’array

Ho provato a guardare ma non ho trovato nulla con una risposta definitiva. So che il mio problema non può essere così difficile. Forse è solo che sono stanco ..

Fondamentalmente, voglio dichiarare un puntatore a un array bidimensionale. Voglio farlo in questo modo perché alla fine dovrò ridimensionare l’array. Ho fatto quanto segue con successo con un array 1D:

int* array; array = new int[somelength]; 

Mi piacerebbe fare quanto segue con un array 2D ma non verrà compilato:

 int* array; array = new int[someheight][somewidth]; 

Il compilatore mi dà un errore affermando che “in qualche modo” non può apparire in un’espressione di costante. Ho provato tutti i tipi di combinazioni di ** e [] [] ma nessuno di loro sembra funzionare. So che non è così complicato … Qualsiasi aiuto è apprezzato.

Ho appena scoperto che questa antica risposta viene ancora letta, il che è un peccato dato che è sbagliato. Guarda la risposta qui sotto con tutti i voti, invece.


Leggi sulla syntax del puntatore, hai bisogno di un array di matrici. Qual è la stessa cosa di un puntatore a un puntatore.

 int width = 5; int height = 5; int** arr = new int*[width]; for(int i = 0; i < width; ++i) arr[i] = new int[height]; 
 const int someheight = 3; const int somewidth = 5; int (*array)[somewidth] = new int[someheight][somewidth]; 

Un esempio pronto all’uso da qui , dopo pochi secondi di ricerca su google con la frase “array dinamici bidimensionali”:

 int **dynamicArray = 0; // memory allocated for elements of rows. dynamicArray = new int *[ROWS]; // memory allocated for elements of each column. for( int i = 0 ; i < ROWS ; i++ ) { dynamicArray[i] = new int[COLUMNS]; } // free the allocated memory for( int i = 0 ; i < ROWS ; i++ ) { delete [] dynamicArray[i]; } delete [] dynamicArray; 

Suggerisco di utilizzare un metodo molto più semplice di una matrice di array:

 #define WIDTH 3 #define HEIGHT 4 int* array = new int[WIDTH*HEIGHT]; int x=1, y=2, cell; cell = array[x+WIDTH*y]; 

Penso che questo sia un approccio migliore rispetto a un array di array, poiché c’è un’allocazione molto inferiore. Potresti anche scrivere una macro helper:

 #define INDEX(x,y) ((x)+(WIDTH*(y))) int cell = array[INDEX(2,3)]; 

Personalmente, preferisco usare un trucco sintattico per dichiarare un puntatore all’array multidimensionale di dimensioni dinamiche. Funziona in compilatori che supportano Array di variabili (VLA), che devono essere compilati da tutti i compilatori C ++ e dai compilatori C più attuali.

L’idea di base è catturata in questo:

 void bar (int *p, int nz, int ny, int nx) { int (*A)[ny][nx] = (int(*)[ny][nx]) p; 

“p” punta al blocco (contiguo) di spazio che si desidera trattare come un array multidimensionale. “A” ha lo stesso valore di “p”, ma la dichiarazione fa sì che il compilatore tratti i riferimenti a “A” nel modo multidimensionale desiderato. Per esempio:

 #include  using namespace std; void bar (int *p, int nz, int ny, int nx) { int (*A)[ny][nx] = (int(*)[ny][nx]) p; for (int ii = 0; ii < nz; ii++) { for (int jj = 0; jj < ny; jj++) { for(int kk = 0; kk < nx; kk++) { A[ii][jj][kk] = ii*1000000 + jj*1000 + kk; } } } } void out (int *p, int nz, int ny, int nx) { int (*A)[ny][nx] = (int(*)[ny][nx]) p; cout << A[11][22][33] << endl; } int main (void) { int NX = 97; int NY = 92; int NZ = 20; int *space = new int [NZ * NY * NX]; bar (space, NZ, NY, NX); out (space, NZ, NY, NX); return 0; } 

L'esecuzione di questo produce l'output "11022033"

La dichiarazione dell'alias "A" è un po 'strana, ma ti permette di usare direttamente e semplicemente la syntax di array multidimensionale desiderata

Penso che lo farà

 int r, c ; std::cin>>r>>c ; int *array = new int[r*c] ; 

Puoi inserire i valori facendo qualcosa di simile

 for (int i = 0 ; i < r ; i++){ for (int j = 0 ; j < c ; j++){ std::cin>>array[i *c + j] ; } }