2012-08-07 16 views
5

sé cómo crear un multidumentional Matriz de statndard:¿Cómo crear un puntero en C++ que apunta a una matriz multidimensional de int?

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

Y sé cómo crear un puntero que apunta a una matriz dimensional:

int * ms = new int[m]; 

Pero, ¿es posible crear un puntero que apunta a la matriz multidumencional?

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 

¿Cómo crear dicho puntero?

+1

posible duplicado de [¿Cómo utilizo las matrices en C++?] (Http://stackoverflow.com/questions/4810664/how-do-i-use-arrays-in-c) – fredoverflow

Respuesta

8

La expresión new int[m][n] crea un array[m] of array[n] of int. Como es una matriz nueva, el tipo de devolución se convierte en un puntero a el primer elemento: pointer to array[n] of int. ¿Qué es lo que tiene de usar:

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

Por supuesto, usted realmente no debería usar una matriz nueva en absoluto. El _best_solution aquí es escribir una clase simple Matrix, usando std::vector para la memoria. Dependiendo de sus sentimientos sobre el asunto, usted puede utilizar la sobrecarga operator()(int i, int j) y (i, j) para la indexación, o puede sobrecargar operator[](int i) para devolver un ayudante que define operator[] hacer la segunda indexación. (Pista: operator[] se define en int*; si no quiere preocuparse por comprobación de límites, etc., int* hará el trabajo como proxy.)

alternativa, algo así como:

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

hará el trabajo, pero a largo plazo, la clase Matrix valdrá .

+0

+1 Por responder la pregunta y explicar por qué esa no es la solución correcta al problema. –

+1

Ver http://stackoverflow.com/a/9760489/245265 para ver un ejemplo de la clase 'Matrix' que envuelve un' std :: vector'. –

+0

+1, mucho mejor pensado que mi respuesta. –

5

Claro, es posible.

que va a crear un puntero a un puntero a un int, y la sintaxis es así como suena:

int** ptr = sales; 

Usted ha visto probablemente más ejemplos de esto que usted piensa que cuando pasan las personas matrices de cadenas (como lo hace en argv en main()), siempre está pasando una matriz de una matriz de caracteres.

Por supuesto que a todos nos prefieren usar std :: string cuando sea posible :)

+4

Una serie de punteros no es lo mismo que una matriz multidimensional. –

3

Recuerdo que fue algo como esto:

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