char(*p)[15];
char(*p)(int *a);
int(*pt)(char*);
int *pt(char*);
quelqu'un d'aide?je n'obtenir ce que les déclarations de variables de pointeur suivantes signifient dans c
char(*p)[15];
char(*p)(int *a);
int(*pt)(char*);
int *pt(char*);
quelqu'un d'aide?je n'obtenir ce que les déclarations de variables de pointeur suivantes signifient dans c
3 est plus susceptible d'être un typedef pour un pointeur de fonction (avec le mot-clé 'typedef' actuel laissé), qu'un prototype de fonction. 4 est un prototype de fonction, mais le type de retour est 'int *', pas 'int'. –
3 n'est pas la même chose que 4. 3 est un pointeur de fonction, 4 est une fonction protype. Les parenthèses supplémentaires font beaucoup de différence. – thkala
4 renvoie int pointeur, pas int –
Un truc simple pour savoir quel type d'un pointeur à est d'enlever tout le *
et voir ce qui reste:
char p[15];
char p(int *a);
int pt(char*);
int pt(char*);
Ce que vous obtenez est une déclaration de variable du type que votre pointeur pointera vers. Ou pas dans le quatrième cas:
int *pt(char*);
est un prototype de fonction et non une déclaration de pointeur valide.
EDIT:
La raison en est que, sans les parenthèses, l'appel de fonction « opérateur » a la priorité sur le pointeur opérateur de déréférencement. Dans le cas ci-dessus, la déclaration en anglais simple est:
Nous avons une fonction pt(char *)
, qui renvoie une int *
Alors que
int (*pt)(char *);
se traduit par:
*pt
est une fonction qui prend un char *
et renvoie un int
.
Ce qui signifie essentiellement que seul pt
est un pointeur vers ce type.
Règle de base: Commencez à l'identifiant et lisez à droite quand vous le pouvez, à gauche quand vous le devez.
)
.Mettez votre "pied droit" d'un caractère à droite de l'endroit où se trouve )
, si c'est ce que vous avez frappé.
[42]
alors que vous lisez à droite, dites "tableau de 42".(
à vers la droite, dites "prise de fonction", puis recurse pour dire le type de chaque paramètre (mais omettez les noms des paramètres eux-mêmes), suivi de "et retour".(
. Mettez votre pied gauche d'un caractère à gauche de la (
si c'est ce que vous frappez.
*
ou un &
alors que vous lisez vers la gauche, dites "pointeur vers" ou "référence vers".const
, int
, MyFoo
), dites-le simplement.* S'il n'y a pas d'identifiant, imaginez où il faut aller - difficile à savoir, mais il n'y a qu'un seul emplacement légal.
suivant ces règles:
Alors qu'il est bon d'avoir une règle complète, je dois admettre que mes pieds me font mal après tout ce saut ... :-) – thkala
Et il vaut mieux ne pas porter des pantalons moulants si vous avez une longue déclaration à décoder :) –
Essayez http://cdecl.org/ – pmg