2010-09-21 9 views
6

J'ai une question qui est en quelque sorte, je suppose, complètement triviale: qu'est-ce que c'est (et pourquoi)?Déclaration de pointeur obscur

const float *(*const*)(int) 

Ma compréhension est qu'il est un « pointeur vers un pointeur constant à une fonction prenant un entier comme argument et renvoyant un pointeur à flotteur constant ».

Est-ce correct?

Comment "analyser mentalement" (*const*)? Surtout qu'il n'y a pas de nom, au début je ne savais pas par où commencer. Je pense que la seule possibilité pour un "nom" serait de le mettre comme ça: *const *name car toute autre combinaison est invalide (si je me trompe), alors "nom est un pointeur vers un pointeur constant ...".

Est-ce que ce raisonnement est valide?

Merci!

+4

J'essaie d'éviter les définitions de ce genre en les décomposant en composants en utilisant typedef. –

+1

c giggerish à FR: "http://cdecl.ridiculousfish.com/?q=const+float+*%28*const*+foo%29%28int%29" – Anycorn

+0

Pour toute personne ayant des difficultés à brancher le code ci-dessus dans un compilateur essayez de le mettre en paramètre dans un prototype de fonction '' int foo (const float * (* const *) (int)) 'qui est le même que' int foo (const float * (* const * var_name) (int)) ; ' – nategoose

Répondre

6

Oui, ce raisonnement est valide. Placez-le à droite de tous les * * qui ne figurent pas dans les listes de paramètres de fonction et à gauche de tous les [] qui ne figurent pas dans les listes de paramètres de fonction. Ensuite, vous avez

const float *(*const* name)(int) 

Puis lisez-le comme d'habitude. A partir de là et même comment trouver l'endroit correct pour le nom, there are de nombreux tutoriels comment analyser cela sur Internet. Pour le C++, vous pouvez rechercher geordi.

< litb> geordi: -c int name; 
< geordi> Success 
< litb> geordi: make name a const float *(*const*)(int) and show 
< geordi> -c float const *(*const* name)(int) ; 
< litb> geordi: << TYPE_DESC(const float *(*const*)(int)) 
< geordi> pointer to a constant pointer to a function taking an integer 
      and returning a pointer to a constant float 

Vous pouvez ensuite faire une analyse sur la syntaxe de celui-ci

< litb> geordi: show parameter-declaration and first decl-specifier-seq 
< geordi> `int` and `float const`. 
< litb> geordi: make name an array of 2 pointer to function taking int and 
     returning pointer to float and show 
< geordi> -c float const *(* name[2])(int); 

Il vous permet de mixer C avec l'anglais

< litb> geordi: make name an array of 2 pointer to (float const*(int)) and show 
< geordi> -c const float *(* name[2])(int); 

Comme vous le voyez, il est assez puissant.

+0

Merci pour le lien vers "geordi", il semble impressionnant! –

12

Vous avez raison de dire que le nom est *const*. Si vous branchez la ligne const float *(*const* name)(int) à cdecl.org, il vous dira que cela signifie « déclarer le nom comme pointeur sur pointeur const à la fonction (int) pointeur retour à const float »

En ce qui concerne l'analyse mentale, je me souviens juste que R (*p)(A) est un pointeur vers la fonction. Par conséquent R (**p)(A) est un pointeur vers le pointeur de la fonction, et tout ce qu'il faut à ce stade est de se rappeler comment const et * interagissent.

+1

+1 pour m'avoir appris sur cdecl.org – nategoose

+1

++ Pour le lien vers cdecl.org – AlcubierreDrive

+0

Merci pour le lien cdecl. –

2

juste travailler à l'extérieur

Vous avez quelque chose de la forme:.

U D(V) 

si vous avez la fonction de quelque chose comme. Quelque chose est une fonction prenant int et renvoyant const float*.

Pour (*const*) vous travaillez en arrière pour obtenir le const au bon endroit (bien qu'étant symétrique cela n'a même pas d'importance ici!). *const* ~ "pointeur sur le pointeur de const", comme (par exemple) dans int * const * pp est un pointeur vers un pointeur const vers un int. Mettre tout ensemble: pointeur sur le pointeur de const pour prendre la fonction int et renvoyer const float *.

+0

Merci! Ce n'était pas trop compliqué. –

Questions connexes