C pointeur de tableau à deux dimensions
Je sais qu'il ya plusieurs questions à propos de ce qui donne de bons (et de travail) et de solutions, mais aucune à mon humble avis qui dit clairement quelle est la meilleure façon d'atteindre cet objectif.
Donc, supposons que nous avons un certain tableau 2D :
int tab1[100][280];
Nous voulons faire un pointeur qui pointe vers ce tableau 2D.
Pour atteindre cet objectif, nous pouvons faire :
int (*pointer)[280]; //pointer creation
pointer = tab1; //assignation
pointer[5][12] = 517; //use
int myint = pointer[5][12]; //use
ou bien :
int (*pointer)[100][280]; //pointer creation
pointer = &tab1; //assignation
(*pointer)[5][12] = 517; //use
int myint = (*pointer)[5][12]; //use
OK, les deux semble bien fonctionner. Maintenant, je voudrais savoir :
- quel est le meilleur moyen, le 1er ou le 2ème ?
- sont à la fois égaux pour le compilateur ? (la vitesse, la perf...)
- est l'une de ces solutions de manger plus de mémoire que les autres ?
- ce qui est le plus fréquemment utilisé par les développeurs ?
- Rappelez-vous qu'un tableau de pointeurs (comme dans
int *pointer[280];
) n'est pas la même chose comme un tableau de tableaux. - bonjour, ferdinand. j'ai corrigé la 1ère solution avec la parenthèse. Il s'excuse.
Vous devez vous connecter pour publier un commentaire.
À l'aide de
pointer2
oupointer3
produire le même binaire à l'exception des manipulations aussi++pointer2
comme l'a souligné WhozCraig.Je recommande d'utiliser
typedef
(produisant du même code binaire comme ci-dessuspointer3
)Remarque: Depuis C++11, vous pouvez également utiliser le mot-clé
using
au lieu detypedef
dans votre exemple:
Remarque: Si le tableau
tab1
est utilisé dans un corps de fonction => ce tableau sera placé dans la pile d'appel de la mémoire. Mais la taille de la pile est limitée. À l'aide de tableaux plus grand que la mémoire libre de la pile produit un stack overflow crash.La pleine extrait est en ligne compilable à gcc.godbolt.org
(pointer*)
au lieu de(*pointer)
dans la deuxième version. 😉 Ok je mettre à jour ma réponse. Cheerspointer2
oupointer3
produire le même binaire" - C'est pas true lors de l'exécution de pointeur de-math.++pointer2
avance le pointeur d'une "ligne".++pointer3
avance le pointeur d'un ensemble de matrice. Ils sont de différents typesint *pointer[280];
//Crée 280 pointeurs de type int.En os 32 bits, 4 octets pour chaque pointeur. donc 4 * 280 = 1120 octets.
int (*pointer)[100][280];
//Crée un pointeur qui est utilisé pour pointer un tableau [100][280] ints.Ici seulement 4 octets.
Pour en venir à votre question,
int (*pointer)[280];
etint (*pointer)[100][280];
sont différentes mais il souligne même tableau 2D de [100][280].Parce que si
int (*pointer)[280];
est incrémenté d'une unité, alors il sera de points à la prochaine 1D tableau, mais où queint (*pointer)[100][280];
traverse l'ensemble du tableau 2D et les points à l'octet suivant. L'accès à celle-octet peut causer problème si ce mémoire ne débite pas partie de vos processus.Vos deux exemples suivants sont équivalents. Toutefois, le premier est moins évidente et plus "hacky", tandis que la seconde indique clairement votre intention.
pointer
points à un tableau 1D de 280 entiers. Dans votre mission, vous avez en fait d'attribuer la première ligne detab1
. Cela fonctionne puisque vous pouvez implicitement la fonte des tableaux de pointeurs (pour le premier élément).Lorsque vous utilisez
pointer[5][12]
, C traitepointer
comme un tableau de tableaux (pointer[5]
est de typeint[280]
), donc il y a un autre implicite exprimées ici (au moins du point de vue sémantique).Dans votre deuxième exemple, vous créer explicitement un pointeur vers un tableau 2D:
La sémantique est plus clair ici:
*pointer
est un tableau 2D, alors vous avez besoin pour accéder à l'aide de(*pointer)[i][j]
.Les deux solutions utilisent la même quantité de mémoire (1 pointeur) et sera plus susceptible de fonctionner aussi vite. Sous le capot, les deux pointeurs même point à la même emplacement de mémoire (le premier élément de la
tab1
tableau), et il est possible que votre compilateur même générer le même code.La première solution est "plus avancé" depuis on a besoin d'une bonne compréhension sur la façon dont les tableaux et les pointeurs en C pour comprendre ce qui se passe. Le deuxième est plus explicite.