int typedef x;
void (*(y (x (*) ()))) ();
int main ()
{
x (*f) (); /* This is a declaration */
y (*f) (); /* This is a procedure call */
}
The declaration of y says:
void (*(y (x (*) ()))) (), that is,
*(y (x (*) ())) is a void function, that is,
y (x (*) ()) is a pointer to a void-function, that is,
y is a (pointer-to-void-function)-function, whose argument is declared by
x (*arg) (), that is,
*arg is a x-function, that is,
arg is a pointer-to-(x-function)
Wheeee!
But x is a type.
So x (*f) (); declares f as a pointer-to-(x-function),
So *f is an x-function, but when passed as an argument its implicitly
passed by address,
as in y(*f). This returns a pointer-to-(void-function), which is
implicitly dereferenced and called by y(*f) ();
It might be "clearer" (:-)) to write
typedef void VOID_FUNCTION ();
typedef VOID_FUNCTION (*PTR_TO_VOID_FUNCTION);
typedef x (*PTR_TO_X_FUNCTION) ();
typedef PTR_TO_VOID_FUNCTION (TYPE_OF_Y (PTR_TO_X_FUNCTION));
TYPE_OF_Y y;