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;