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