All pastes #34302 Raw Edit

Something

public text v1 · immutable
#34302 ·published 2005-12-20 04:24 UTC
rendered paste body
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;