5 votes

Comment créer un pointeur en C++ qui pointe vers un tableau multidumentionnel d'int ?

Je sais comment créer un tableau multidumentionnel de façon standard :

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

Et je sais comment créer un pointeur qui pointe vers un tableau à une dimension :

int * ms = new int[m];

Mais est-il possible de créer un pointeur qui pointe vers un tableau multidumentionnel ?

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

Comment créer un tel pointeur ?

8voto

James Kanze Points 96599

L'expression new int[m][n] crée un array[m] of array[n] of int . Comme il s'agit d'un tableau nouveau, le type de retour est converti en un pointeur vers le premier élément : pointer to array[n] of int . C'est ce que vous devez utiliser :

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

Bien sûr, vous ne devriez pas du tout utiliser array new. Le site meilleure _solution_ ici est d'écrire un simple fichier Matrix en utilisant std::vector pour la mémoire. En fonction de vos sentiments sur le sujet, vous pouvez soit surcharger operator()( int i, int j ) et utiliser (i, j) pour l'indexation, ou vous pouvez surcharger operator[]( int i ) pour renvoyer un qui définit operator[] pour faire la deuxième indexation. (Conseil : operator[] est défini sur int* ; si vous ne voulez pas vous embarrasser de vérification des limites, etc, int* fera le travail en tant que mandataire).

Ou alors, quelque chose comme :

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

fera l'affaire, mais sur le long terme, les Matrix sera d'une valeur de la peine.

5voto

w00te Points 11664

Bien sûr, c'est possible.

Vous allez créer un pointeur sur un pointeur sur un int, et la syntaxe est exactement ce qu'elle semble être :

int** ptr = sales;

Vous avez probablement vu plus d'exemples de cela que vous ne le pensez, car lorsque les gens passent des tableaux de chaînes de caractères (comme vous le faites dans argv dans main()), vous passez toujours un tableau d'un tableau de caractères.

Bien sûr, nous préférons tous utiliser std::string lorsque cela est possible :)

3voto

sedran Points 1205

Je me souviens que c'était quelque chose comme ça :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X