Компилятор выдает ошибку в вашем коде - поэтому код недействителен .
int *p(int, int);
- объявляет функцию, возвращающую указатель
int (*p)(int, int);
- определяет указатель к функции.
Вы можете использовать typedefs, чтобы использовать "обычный синтаксис указателя:
typedef int functype(int, int);
functype *p; // defines the function pointer `p`
Кстати, ваш пример будет легче читать, если мы будем использовать typedef
s
typedef int func(int, int);
int add(int a, int b){ return a+b; }
int add2(func *funcptr){
return funcptr(2,3);
}
func *factory(int n){
printf("got params:%i\n",n);
return add;
}
int main(){
func *funcptr = factory(5);
printf("%i\n",funcptr(1,2));
}
https://godbolt.org/z/zj4Yax