2010-04-05 6 views

Répondre

7

int *(*pfp)();

Crée un pointeur vers une fonction qui renvoie un int *. Le nom du pointeur de fonction est pfp.

Voici un exemple:

int* myFunc(void) 
{ 
    return NULL; 
} 


int main(int argc, char**argv) 
{ 
    int *(*pfp) (void); 
    pfp = myFunc; 
    return 0; 
} 

Note: Étant donné que les paramètres du pointeur de fonction n'est pas (vide) que vous avez donné, cela signifie que la liste des paramètres est pas spécifié dans C. En C++, cela signifierait que c'est une fonction sans paramètre exactement.

+0

Et les paramètres de la fonction ne sont pas spécifiés non plus. (S'il n'avait pas de paramètres, ce serait 'int * (* pfp) (void);' à la place.) –

0

pfp est un pointeur sur une fonction qui ne prend aucun paramètre (ou paramètre indéterminé en C) et renvoie un pointeur vers un int.

Utilisation de la « aiguilles d'une montre spirale » règle est un moyen efficace de déchiffrer les déclarations complexes C (au moins je trouve efficace):

4

Brian est expliqué le « quoi », mais si vous êtes curieux de savoir le pourquoi, voici un extrait de The Development of the C Language Dennis Ritchie:

La deuxième innovation qui distingue le plus clairement C de ses prédécesseurs est ce plus complète structure de type et surtout son expression dans la syntaxe des déclarations. NB offrait les types de base int et char, ainsi que leurs tableaux, et des pointeurs vers eux, mais pas d'autres moyens de composition. La généralisation était nécessaire: étant donné un objet de n'importe quel type, il devrait être possible de décrire un nouvel objet qui en rassemble plusieurs dans un tableau, le donne d'une fonction, ou est un pointeur vers lui.

Pour chaque objet d'un tel type composé, il y avait déjà un moyen de mentionner l'objet sous-jacent: indexer le tableau, appeler la fonction, utiliser l'opérateur d'indirection sur le pointeur. Le raisonnement analogique a conduit à une syntaxe de déclaration pour les noms reflétant celle de la syntaxe d'expression dans laquelle les noms apparaissent typiquement. Ainsi,

    int i, *pi, **ppi;

déclare un entier, un pointeur vers un entier, un pointeur vers un pointeur vers un entier. La syntaxe de ces déclarations reflète l'observation que i, * pi et ** ppi donnent tous un type int lorsqu'ils sont utilisés dans une expression. De même,

    int f(), *f(), (*f)();

déclarer une fonction renvoyant un entier, une fonction renvoyant un pointeur sur un entier, un pointeur vers une fonction renvoyant un entier;

    int *api[10], (*pai)[10];

déclarer un tableau de pointeurs sur des entiers et un pointeur vers un tableau d'entiers. Dans tous ces cas, la déclaration d'une variable ressemble à son utilisation dans une expression dont le type est celui qui est en tête de la déclaration.

Pour plus d'informations, lisez "Reading C type declarations" ou Eric "Reading C Declarations: A Guide for the Mystified" de Giguère Steve Friedl.