Comment la priorité est-elle déterminée dans les pointeurs C?

14

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:

  1. *(ptr)
  2. (int)
  3. *(*ptr)(int)
  4. *(*(*ptr)(int))

Alors,

  1. double **
  2. char c

Deuxième exemple

unsigned **( * (*ptr) [5] ) (char const *,int *)
  1. *(ptr)
  2. [5]
  3. *(*ptr)[5]
  4. *(*(*ptr)[5])
  5. **(*(*ptr)[5])

Comment dois- je les lire?

trapaank
la source
1
Demander comment un langage gère ses fonctionnalités est sur le sujet ici.

Réponses:

7

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é **

Daniel Scocco
la source
7

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

Gary Willoughby
la source
Merci de votre réponse. Mais dans la méthode Clockwise Spiral d'où commencer dans mon cas? Dans les exemples donnés sur le lien, il y a des exemples simples. Je ne suis pas en mesure de faire correspondre mon équation avec cette méthode.
trapaank
1
vous devez partir de votre identifiant: ptr. vous aurez: "ptr est un pointeur sur une fonction qui prend un int et renvoie un pointeur sur une fonction qui prend un pointeur sur un pointeur sur un double et un char et renvoie un pointeur sur un flotteur". essayez le spyral et vous obtiendrez la même chose.
Remo.D
1

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)

Michael Shaw
la source
4
Je parie que la personne qui l'a écrit est l'enseignant.
mouviciel
Espérons que ce n'est pas l'enseignant, car vous n'avez pas besoin de connaître des conneries comme ça. Bien que je suppose qu'un bon professeur vous giflerait d'abord avec des expressions comme celles-ci, vous laissant vous gratter la tête en essayant de les interpréter, puis vous montrer comment utiliser correctement typedef.