Je peux déclarer: p>
SO C FAQ Dis: P>
généralement, vous ne voulez pas. p>
blockQuote> int (* ap) [n]; code> p>
AP code> est le pointeur sur INT de taille de taille N. Pourquoi est-ce toujours utile? Si je le transmette à la fonction, quelle chose utile qu'elle puisse faire avec cela qu'il ne pouvait pas faire avec un pointeur normal sur le contenu de la matrice? P>
9 Réponses :
Ce n'est pas utile, vraiment. Mais parfois des pointeurs vers des tableaux sont utilisés par ex. Dans Microsoft Windows Api - j'ai vu beaucoup de ces choses là-bas. P>
Quoi pour utilisé dans l'API WIN?
Vous pouvez google pour '"pointeur au tableau" inurl: msdn.microsoft.com'. Exemples: msdn.microsoft.com/en-us/library/ms221359.aspx < / a>, msdn.microsoft.com/fr- US / Bibliothèque / MS714816% 28VS.85% 29.aspx etc.
@ adam.quis: regardé ces liens - cela ne ressemble pas à de vrais pointeurs à des tableaux en C, juste des pointeurs
Vous avez raison dans le terme le plus strict. Pour eux, "pointeur au tableau" est un pointeur sur le premier élément, pas un pointeur pour le tableau comme vous l'avez dit dans la question.
Si vous incrémentez le pointeur, cela indiquera ensuite le début du prochain groupe d'éléments N. P>
Ce n'est pas une grosse affaire et son utilisation est à la hauteur du développeur. P>
Gosh, avez-vous même vu cela utilisé?
Super de voir quelqu'un sait que les deux ne sont pas les mêmes =)
@bmargulies: Je l'ai utilisé pour un tableau de checksums MD5 où chaque somme de contrôle est de 16 octets.
Cela se cachera probablement de manière subjective / argumentative, mais ... p>
À mon avis, les pointeurs vers des tableaux sont dans la langue parce qu'ils sont tombés dans la langue. Il y a des pointeurs à tous les autres types de données déclarés, donc ceux-ci sont ici aussi. Je n'ai jamais vu que personne ne s'améliore vraiment d'eux. Hypothétiquement, ils permettent un prototype qui exige une matrice et non un pointeur à l'élément, mais ... p>
... Mais ils sont la même chose (un pointeur à l'élément (premier) et un pointeur à un tableau)? :)
Ils évaluent au même endroit, mais les types sont différents et les types importants.
Cela me semble assez inutile de faire un pointeur à un tableau. En C, un tableau est déjà un pointeur sur un bloc de ce type de données.
int (*ap)[N]; int **ipp;
Non, ils ne sont pas le même type de données. Donc, vous dites que c'est bien de faire IPP = ap; ap; code> et ap = ipp; code> (supposant que les pointeurs indiquent quelque part utile)?
Ils ne sont pas les mêmes. Essayez ++ ap code> et ++ IPP code> et voyez ce que vous obtenez.
Les tableaux ne sont pas b> Pointeurs. Un tableau Expression i> peut être converti implicitement en type pointeur dans la plupart des contextes, mais ce n'est pas la même chose. Dans votre exemple, ap code> et IPP code> ne sont pas des types compatibles; Vous ne pouviez pas attribuer la valeur de ap code> à IPP code> ou vice versa (au moins pas sans une fonte explicite).
Il existe des situations où vous souhaitez transmettre l'emplacement de la mémoire entre les programmes. E.G Une API Windows pourrait vous attendre à ce que vous transmettez un pointeur sur la structure de données ou une matrice où vous programmez dans une autre langue, dites c #. Windows API ne se soucie pas de la manière dont la langue cible gère des matrices, pour Windows API, il s'agit d'un flux d'octets en mémoire et il le remplacera, le renvoient. Pour éviter le type de langage croisé Missmatch dans certains cas, nous utilisons le pointeur vers le tableau plutôt que le nom de la matrice implicite en tant que pointeur. De plus, il n'est pas garanti que le nom de la matrice implicite est un pointeur long, certains compilateurs pourraient l'optimiser comme une valeur relative avec le segment. Un pointeur à un tableau garantit qu'il est de l'ordre de la taille du registre de la machine et que vous pouvez indiquer un emplacement n'importe où dans la RAM disponible. P>
Un pointeur sur un tableau peut être utilisé pour allouer de manière dynamique un réseau multidimensionnel N, où les dimensions N-1 sont connues. Ci-dessous crée un tableau NX3.
+-----+ +------+ +-----+
ap ---> | int | vs. pp ---> | int* | -> | int |
| int | +------+ +-----+
| int | pp+1 -> | int* | -\
+-----+ +------+ \ +-----+
ap+1 -> | int | : : -> | int |
| int | +-----+
| int |
+-----+
: :
Mais sans doute AP est juste un tableau 2D.
Oui, mais ce n'est pas la même chose que "INT AP [4] [3];". Il permet à la 2e dimension d'être allouée de manière dynamique.
Ah je vois, auquel cas j'admettais mon erreur et retirez ma réponse.
Généralement, la seule fois que vous verrez un pointeur à un tableau ( Notez que pour une déclaration de paramètre de fonction, t (* a) [n] code>) est en tant que paramètre de fonction, où A code> est signifiait être un tableau 2D: int a [] [n] code> est équivalent à int (* A ) [N] code>, mais c'est seul em> true pour les paramètres de fonction DÉCLARATIONS: P>
Expression Type Implicitly converted to
---------- ---- -----------------------
a T [M][N] T (*)[N]
a[0] T [N] T *
&a T (*)[M][N]
&a[0] T (*)[N]
&a[0][0] T *
Je pense que la conclusion de toute cette discussion est
Le code suivant fait partie de mon article: Pointeurs et tableaux en C C ++ Strong> Vous pouvez vérifier @ Les pointeurs et les tableaux 2D strong> p> Le code suivant illustre comment déclarer et accéder à un tableau 2D. Sous la matrice 2D réside dans une matrice dimensionnelle. Vous serez sûr d'en savoir plus après avoir joué avec la pièce de code suivante. p> Understanding Pointers and 2D Arrays
Print array using array name ...
0 2 4 6 8
1 3 5 7 9
2 4 6 8 10
Print array using a pointer. Proof of 1 D array being allocated ...
0 2 4 6 8 1 3 5 7 9 2 4 6 8 10
Notice that array is printed row by row in a linear fashion.
Un pointeur sur un pointeur à un int cependant est utile.
Je ne pense pas que je n'ai jamais eu besoin de coder en utilisant un pointeur sur un tableau dans les 25 années de 25 ans que je suis programmée dans C. (Je n'ai utilisé que Triple Pointers - Automatique *** Var - plusieurs fois et changé le code pour les éviter dès que possible.)
@Reinier: Bien sûr mais je n'ai pas demandé à ce sujet
Ce n'est pas un pointeur à un tableau. c'est un tableau d'auteurs d'int. Un tableau est un pointeur lui-même.
Une telle variable est généralement allouée sur la pile, c'est la raison pour laquelle un pointeur peut être assez dangereux.
@Dave, ce n'est pas un tableau d'auteurs d'int, c'est un pointeur à N int.
C'est en effet un pointeur à un tableau et un tableau est pas i> un pointeur lui-même.
@ Le commentaire de Dave est la preuve du concept pourquoi les commentaires devraient aussi avoir la bulletin
@Dave: au risque de dogppiling, des tableaux et des pointeurs sont les plus énergiquement pas b> la même chose, et la déclaration
int (* ap) [n] code> définitap Code> en tant que pointeur sur un réseau N-Element de Int, pas un réseau N-Element de pointeur sur INT.