2012-08-07 5 views
5

so come creare un multidumentional modo gamma statndard:Come creare un puntatore in C++ che punta a una matrice multidumentale di int?

const int m = 12; 
const int y = 3; 
int sales[y][n]; 

E so come creare un puntatore che punta a un array tridimensionale:

int * ms = new int[m]; 

Ma è possibile creare un puntatore che punta all'array multidimensionale?

int * sales = new int[y][m]; // doesn't work 
int * mSales = new int[m]; // ok 
int * ySales = new int[y]; // ok 
mSales * ySales = new mSales[y]; // doesn't work, mSales is not a type 

Come creare un puntatore del genere?

+1

possibile duplicato di [Come utilizzare gli array in C++?] (Http://stackoverflow.com/questions/4810664/how-do-i-use-arrays-in-c) – fredoverflow

risposta

8

L'espressione new int[m][n] crea un array[m] of array[n] of int. Poiché è un array nuovo, il tipo restituito viene convertito in un puntatore a il primo elemento: pointer to array[n] of int. Che è quello che hai usare:

int (*sales)[n] = new int[m][n]; 

Naturalmente, davvero non dovrebbe usare array di nuovo a tutti. Lo _best_solution qui è quello di scrivere una semplice classe Matrix, usando std::vector per la memoria. A seconda delle tue sensazioni sulla questione, è possibile sovraccarico operator()(int i, int j) e utilizzare (i, j) per l'indicizzazione, oppure si può sovraccaricare operator[](int i) per restituire un aiutante che definisce operator[] a fare il secondo di indicizzazione. (Suggerimento: operator[] è definito sulla int*, se non si vuole perdere tempo con il controllo dei limiti, ecc, int* farà il lavoro come proxy.)

In alternativa, qualcosa di simile:

std::vector<std::vector<int> > sales(m, n); 

farà il lavoro, ma a lungo termine, la classe Matrix varrà lo .

+0

+1 Per rispondere alla domanda e spiegare perché non è la soluzione giusta al problema. –

+1

Vedere http://stackoverflow.com/a/9760489/245265 per un esempio di classe 'Matrix' che racchiude un' std :: vector'. –

+0

+1, molto meglio pensato della mia risposta. –

5

Certo, è possibile.

sarete creare un puntatore a un puntatore a un int, e la sintassi è proprio come sembra:

int** ptr = sales; 

Avete probabilmente visto altri esempi di questo di quanto si pensi, come quando le persone passano array di stringhe (come si fa in argv in main()), si passa sempre una matrice di una matrice di caratteri.

Naturalmente saremmo tutti preferiscono utilizzare std :: string quando possibile :)

+4

Un array di puntatori non è lo stesso di un array multidimensionale. –

3

mi ricordo che era qualcosa di simile:

int** array = new int*[m]; 
for(int i=0; i<m; i++) { 
    array[i] = new int[n]; 
}