Когда вы объявляете параметр функции как функцию, компилятор автоматически настраивает его тип на «указатель на функцию».
int foo1 (int foo2 (int a))
в точности совпадает с
int foo1 (int (*foo2)(int a))
(Это похоже на то, как объявление параметра функции в виде массива (например, int foo2[123]
) автоматически делает его указателем (например, int *foo2
).)
Что касается того, как вы можете использовать foo2
: вы можетевызовите его (например, foo2(42)
) или вы можете разыменовать его (*foo2
), который (как обычно с функциями) сразу же снова затухает до указателя (который вы затем можете вызвать (например, (*foo2)(42)
), или снова разыменовываете (**foo2)
, который немедленно возвращается к указателю, который ...).
Чтобы вызвать foo1
, вам нужно передать ему указатель на функцию. Если у вас нет существующего указателя на функцию,Вы можете определить новую функцию (за пределами main
), например:
int bar(int x) {
printf("hello from bar, called with %d\n", x);
return 2 * x;
}
Затем вы можете сделать
foo1(&bar); // pass a pointer to bar to foo1
или эквивалентно
foo1(bar); // functions automatically decay to pointers anyway