Указатель на функцию которая принимает и возвращает int:
int (*p_f1)(int);
int f1(int i)
{
return 0;
}
Указатель на функцию которая принимает int, возвращает указатель на функцию которая принимает double и возвращает int:
int (*(*p_f2)(int))(double);
int (*f2(int i))(double)
{
return NULL;
}
Указатель на функцию которая принимает int, возвращает указатель на функцию которая принимает double, которая в свою очередь возвращает указатель на функцию которая принимает float и возвращает int:
int (*(*(*p_f3)(int))(double))(float);
int (*(*f3(int i))(double))(float)
{
return NULL;
}
Тут все тоже самое что и выше, только конечный указатель на функцию которая принимает и возвращает int:
int (*(*(*(*p_f4)(int))(double))(float))(int);
int (*(*(*f4(int i))(double))(float))(int)
{
return NULL;
}
Ну и наконец-то присваивание указателей:
int main(void)
{
p_f1 = f1;
p_f2 = f2;
p_f3 = f3;
p_f4 = f4;
return (0);
}