Что означает эта странная декларация указателя функции в C?

Может кто-нибудь объяснить, что int ((*foo(int)))(int) в этом делает?

int (*fooptr)(int);
int ((*foo(int)))(int); // Can't understand what this does.

int main()
{
    fooptr = foo(0);
    fooptr(10);
}

.

Ответ 1

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

Это объявляет foo как функцию, которая ожидает аргумент типа int и возвращает указатель на функцию, которая ожидает аргумент типа int и возвращает int.

Чтобы быть более ясным:

          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   

Здесь является хорошим объяснением того же.

Ответ 2

foo

- это то, что мы объявляем.

foo(int)

Это функция, которая принимает один аргумент int

*foo(int)

и возвращает указатель

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

к функции, которая принимает один аргумент int

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

и возвращает int.

Одна пара () является избыточной. То же самое можно выразить как

int (*foo(int))(int)

Ответ 3

Там уже ответы на это, но я хотел подойти к нему обратным образом.

Объявление функции выглядит так же, как объявление переменной, за исключением того, что имя переменной заменяется именем функции и параметрами.

Итак, это объявляет bar как указатель на функцию, которая принимает int и возвращает int:

int (*bar)(int);

Если вместо переменной bar это функция foo(int) с этим возвращаемым значением, вы заменяете bar на foo(int) и получаете:

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

Добавьте ненужную пару круглых скобок, и вы получите:

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

Ответ 4

Согласно cdecl, foo:

declare foo as function (int) возвращающий указатель на функцию (int), возвращающую int