J'ai rencontré deux déclarations de pointeur que j'ai du mal à comprendre. Ma compréhension des règles de priorité va quelque chose comme ceci:
Operator Precedence Associativity
(), [ ] 1 Left to Right
*, identifier 2 Right to Left
Data type 3
Mais même avec cela, je n'arrive pas à comprendre comment évaluer correctement les exemples suivants:
Premier exemple
float * (* (*ptr)(int))(double **,char c)
Mon évaluation:
*(ptr)
(int)
*(*ptr)(int)
*(*(*ptr)(int))
Alors,
double **
char c
Deuxième exemple
unsigned **( * (*ptr) [5] ) (char const *,int *)
*(ptr)
[5]
*(*ptr)[5]
*(*(*ptr)[5])
**(*(*ptr)[5])
Comment dois- je les lire?
Réponses:
Ma conjecture pour la première : ptr est un pointeur sur une fonction qui prend en paramètre un int, et renvoie un pointeur sur une fonction qui prend en paramètres un pointeur sur pointeur à doubler et un caractère, et renvoie un pointeur à flotter.
Interprétation :
(* ptr) (int)
dit que ptr est un pointeur vers une fonction prenant un int comme argument. Pour découvrir ce que cette fonction renvoie, nous devons élargir notre vue:
(* (* ptr) (int))
cela signifie que la fonction renvoie un pointeur vers une autre fonction. Les paramètres de cette autre fonction sont:
(double **, car c)
et ça revient
flotteur *
Et pour le second : ptr est un pointeur vers un tableau de cinq pointeurs vers des fonctions qui prennent comme paramètres un pointeur constant vers char et un pointeur vers int, renvoyant un pointeur vers un pointeur de entier non signé.
Interprétation :
(* (* point) [5])
déclare ptr comme un pointeur vers un tableau de cinq pointeurs vers une fonction prenant
(caractère const *, int *)
comme arguments et retour
non signé **
la source
Vous pouvez essayer la méthode 'The Clockwise Spiral' pour comprendre ces déclarations insensées:
http://c-faq.com/decl/spiral.anderson.html
J'ai aussi blogué à ce sujet ici:
http://www.kalekold.net/index.php?post=4
la source
C'est un pointeur de fonction. La personne qui l'a écrit aurait pu mieux utiliser les dactylographes pour le rendre plus clair.
Il s'agit en fait d'un pointeur pour fonctionner avec ces paramètres. float * myfunc (double **, char)
la source
Utilisation de cdecl.org:
déclarer la barre comme pointeur const vers le tableau 5 du pointeur vers la fonction (int) renvoyant le pointeur const vers char
déclarer ptr comme pointeur vers le tableau 5 du pointeur vers la fonction (pointeur vers const char, pointeur vers int) retour du pointeur vers pointeur vers non signé
la source