Que signifie cette déclaration de pointeur de fonction étrange en C?

Quelqu’un peut-il s’il vous plaît expliquer ce que int ((*foo(int)))(int) dans ce fait?

 int (*fooptr)(int); int ((*foo(int)))(int); // Can't understand what this does. int main() { fooptr = foo(0); fooptr(10); } 

.

 int ((*foo(int)))(int); 

Cela déclare foo comme une fonction qui attend un argument de type int et renvoie un pointeur sur une fonction qui attend un argument de type int et renvoie un int .

Pour être plus clair:

  foo -- foo foo( ) -- is a function foo(int) -- taking an int argument *foo(int) -- returning a pointer (*foo(int))( ) -- to a function that (*foo(int))(int) -- takes an int argument int (*foo(int))(int) -- and returning an int 

Voici une bonne explication pour la même chose.

 foo 

est ce que nous déclarons.

 foo(int) 

C’est une fonction qui prend un seul argument int

 *foo(int) 

et retourne un pointeur

 ((*foo(int)))(int) 

à une fonction qui prend un seul argument int

 int ((*foo(int)))(int) 

et retourne un int .

Une paire de () est redondante. La même chose peut être exprimée comme

 int (*foo(int))(int) 

Il y a déjà des réponses à cela, mais je voulais l’aborder de la manière opposée.

Une déclaration de fonction a le même aspect qu’une déclaration de variable, sauf que le nom de la variable est remplacé par le nom de la fonction et les parameters .

Donc, ceci déclare bar comme un pointeur sur une fonction qui prend un int et renvoie un int :

 int (*bar)(int); 

Si, au lieu d’une bar variable, il s’agit d’une fonction foo(int) avec cette valeur de retour, vous remplacez bar par foo(int) et vous obtenez:

 int (*foo(int))(int); // ^^^^^^^^ // this was "bar" before 

Ajoutez une paire de parenthèses inutiles et vous obtenez:

 int ((*foo(int)))(int); // ^ ^ // extra parentheses 

Selon cdecl , foo est:

déclarer foo en tant que fonction (int) renvoyant le pointeur sur fonction (int) renvoyant int