(1) typedef void (*int_arg)(int);
This is a pointer to a function which takes an int and returns void.
(2) typedef int_arg (*pf)(int*,int*,int_arg);
This is a pointer to a function which takes three arguments:
int*
[ii] int*
[iii] void (*)(int)
And whose return type is:
void (*)(int);
Here's how we put them together. First of all, start off with the function
return type, which is ultimately the "fundamental type" of the entire
declaration:
void (*pf)(int);
From here, we turn it into a function by putting parentheses directly after
the name, and filling these parentheses with the function parameter types:
void ( *pf(int*,int*,void(*)(int)) )(int)
We now turn this into a pointer to what it already is by enclosing the name
in parentheses with an asterisk:
typedef void ( *(*pf)(int*,int*,void(*)(int)) )(int);
As follows:
typedef void (*int_arg)(int);
/* typedef int_arg (*pf)(int*,int*,int_arg); */
typedef void ( *(*pf)(int*,int*,void(*)(int)) )(int);
int main()
{
int_arg x;
pf p;
x = p(0,0,x);
}