Déclarer un pointeur de tableau multidimensionnel et d'allouer le tableau
J'ai essayé de chercher mais je n'ai pas trouvé quoi que ce soit avec une réponse définitive. Je sais que mon problème ne peut pas être si difficile que ça. Peut-être que c'est juste que je suis fatiguée..
Fondamentalement, je veux déclarer un pointeur vers un 2 dimensions tableau. Je veux faire de cette façon parce que finalement, je vais avoir à redimensionner le tableau. J'ai effectué les opérations suivantes avec succès avec un tableau 1D:
int* array;
array = new int[somelength];
Je voudrais effectuer les opérations suivantes avec un tableau 2D, mais il ne compile pas:
int* array;
array = new int[someheight][somewidth];
Le compilateur me donne un message d'erreur indiquant que "somewidth" ne peut pas apparaître dans une constante de l'expression. J'ai essayé toutes sortes de combinaisons de ** et [], [], mais aucun d'entre eux semblent fonctionner. Je sais que ce n'est pas si compliqué que ça...Toute aide est appréciée.
Vous devez vous connecter pour publier un commentaire.
Je viens de trouver cette ancienne réponse obtient encore lire, ce qui est dommage car c'est faux. Regardez la réponse ci-dessous avec tous les suffrages à la place.
Lire sur la syntaxe de pointeur, vous avez besoin d'un tableau de tableaux. Qui est la même chose comme un pointeur vers un pointeur.
Prêts à l'emploi exemple de ici, après quelques secondes de recherche sur google avec l'expression "en deux dimensions tableau dynamique":
int staticArray[ ROWS ][ COLUMNS ];
. Supposons également qu'il existe une fonctionprintArray( int arr[ ROWS ][ COLUMNS ] )
dont l'accès et imprime tous les éléments quearr[ i ][ j ]
. On pourrait passerstaticArray
oudynamicArray
à cette fonction et qu'il allait travailler, correct? Il n'y a de différence structurelle et votre point est valide. Cependant, puisqu'il n'y a pas de différence de comportement, j'ai tendance à considérer la différence comme un détail d'implémentation.int[N]
(tableau deN
entiers) commeint *
(pointeur d'entier), mais vous ne pouvez pas passerint[R][C]
(tableau de R de la matrice de C des entiers) comme unint **
(pointeur de pointeur d'entier); il n'y a pas de conversion implicite et si vous le lancez pour le faire fonctionner, vous aurez corruption de la mémoire;int [R][C]
se désintègre àint (*)[C]
(pointeur de tableau deC
entiers) au lieu de...voir cette réponsestaticArray[x][y]
seraient consultés contredynamicArray[x][y]
par le compilateur...la première est*(&staticArray[0][0] + (x * C + y))
, mais le second est*(*(&dynamicArray[0] + x) + y)
; pas équivalent à tous lesprintArray()
), il n'y a pas de différence. (En d'autres termes, la différence est prélevée out). D'accord ou pas d'accord? [Je considère que le même genre de situation que quand j'ai créer unArray2d
classe, et de fournir une fonction membregetElement( int i, int j)
, l'utilisateur n'est pas censés savoir commentgetElement()
est mis en œuvre.]int**
commeint[R][C]
ne fonctionnera pas.Je suggère d'utiliser une méthode beaucoup plus simple qu'un tableau de tableaux:
Je pense que c'est une meilleure approche que d'un tableau d'un tableau, comme il y a beaucoup moins de l'allocation. Vous pouvez même écrire une aide macro:
Personnellement, ma préférence est d'utiliser un syntaxiques astuce pour déclarer un pointeur vers l'dynamiquement la taille d'un tableau multi-dimensionnel. Cela fonctionne dans les compilateurs que le soutien de Longueur Variable Tableaux (Blaise), qui tous les compilateurs C++ doit, et le plus actuel des compilateurs C.
L'idée de base est capturée dans cette:
"p" points à l' (contiguë) bloc de l'espace que vous désirez traiter comme un tableau multidimensionnel. "A" a la même valeur que "p", mais la déclaration rend le compilateur de traiter les références à la "Une" dans le multi-dimensionnel de la façon dont vous le souhaitez.
Par exemple:
L'exécution de ce produit à la sortie "11022033"
La déclaration de la "Une" alias est un peu bizarre à regarder, mais il vous permet d'accéder directement et simplement utiliser l'souhaité un tableau multi-dimensionnel de la syntaxe
Je pense que cela va faire
Vous pouvez saisir les valeurs en faisant quelque chose comme ce