Функция которая возвращает указатель на функцию..

Указатель на функцию которая принимает и возвращает 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);
}