11
votes

Quand le pointeur est-il utile?

Je peux déclarer:

int (* ap) [n];

SO AP 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?

C FAQ Dis:

2.12: Comment déclarer un pointeur à un tableau?

généralement, vous ne voulez pas.


9 commentaires

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 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 la même chose, et la déclaration int (* ap) [n] définit ap en tant que pointeur sur un réseau N-Element de Int, pas un réseau N-Element de pointeur sur INT.


9 Réponses :


2
votes

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.


4 commentaires

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.



6
votes

Si vous incrémentez le pointeur, cela indiquera ensuite le début du prochain groupe d'éléments N.

Ce n'est pas une grosse affaire et son utilisation est à la hauteur du développeur.


3 commentaires

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.



0
votes

Cela se cachera probablement de manière subjective / argumentative, mais ...

À 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 ...


2 commentaires

... 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.



-1
votes

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;


3 commentaires

Non, ils ne sont pas le même type de données. Donc, vous dites que c'est bien de faire IPP = ap; ap; et ap = ipp; (supposant que les pointeurs indiquent quelque part utile)?


Ils ne sont pas les mêmes. Essayez ++ ap et ++ IPP et voyez ce que vous obtenez.


Les tableaux ne sont pas Pointeurs. Un tableau Expression 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 et IPP ne sont pas des types compatibles; Vous ne pouviez pas attribuer la valeur de ap à IPP ou vice versa (au moins pas sans une fonte explicite).



2
votes

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.


0 commentaires

14
votes

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 |
         +-----+
           : :  


3 commentaires

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.



3
votes

Généralement, la seule fois que vous verrez un pointeur à un tableau ( t (* a) [n] code>) est en tant que paramètre de fonction, où A code> est signifiait être un tableau 2D: xxx pré>

Notez que pour une déclaration de paramètre de fonction, 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 *


0 commentaires

-5
votes

Je pense que la conclusion de toute cette discussion est jamais . Personne ici a vraiment démontré une utilisation pour cette construction où quelque chose d'autre ne fonctionnerait pas de manière plus compréhensible.


0 commentaires

-1
votes

Le code suivant fait partie de mon article: Pointeurs et tableaux en C C ++ Strong>

Vous pouvez vérifier @ http://pointersandarrays.blogspot.com/ p>

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>

CODE SNIPPET # 4 FORT> 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.  


0 commentaires