Répondre
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.
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):
Utilisez http://www.cdecl.org/ pour ces choses, si tu n'es pas sûr.
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.
- 1. Initialiser int [] [,] en C#
- 2. Comment faire typeof (int) dans C++ managé?
- 3. Comment faire pour convertir la chaîne à int en C
- 4. tableaux Int en Objective-C
- 5. C# convertissant int en Int64
- 6. Int à Char en C#
- 7. Comment marshal int * en C#?
- 8. System.Web.UI.WebControls.Unit à int en C#
- 9. C++ uint, unsigned int, int
- 10. ce que cette ligne faire en C#
- 11. convertir la chaîne en int en C++
- 12. Quelle est la différence entre 'int?' et 'int' en C#?
- 13. Faire défiler les valeurs int
- 14. Convertir IntPtr en int * en C#?
- 15. Convertir int en tableau d'octets en C?
- 16. convertir décimal en int en C#
- 17. tableau 3D C++ en utilisant int [] opérateur
- 18. Octet de string/int en C++
- 19. Comment faire Dictionnaire <int, int> par javascript
- 20. opérateur Surcharge en C++ comme int + obj
- 21. Conversion de mysqlpp :: String en C++ int
- 22. Conversion IO Int en Int
- 23. C# chaîne [] à int []
- 24. Diviser Int en int et retourner int
- 25. int num = * (int *) nombre; Qu'est-ce que ça fait?
- 26. C++ Que faire pour lexicographical_compare?
- 27. Faire en sorte unsigned int/long exécuter toujours dans un contexte contrôlé en C#
- 28. Int32 contre Int64 vs Int en C#
- 29. problème ostringstream avec int en C++
- 30. OR-octets en C# donne int
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.) –