[Solved] Describe: int (*(*var[3])())(void (*)());


Start with the leftmost identifier and work your way out, remembering that () and [] bind before *, so:

T *a[N]      // a is an array of pointer to T
T (*a)[N]    // a is a pointer to an array of T
T *f()       // f is a function returning pointer to T
T (*f)()     // f is a pointer to a function returning T

Edit

Although it doesn’t show up in this declaration, const can introduce its own share of wrinkles:

T const *p   // p is a pointer to constant T
const T *p   // same as above

In both of these cases, p points to a constant T. You can write to p (make it point to a different object), but you cannot write to *p (you cannot update the value of the thing p points to).

T * const p  // p is a constant pointer to T

This declares p as a constant pointer to T; You can write to *p (update the value of the thing p points to, assuming *p results in a modifiable lvalue), but you cannot write to p (you can’t make it point to a different object).

End edit

So

        var                      -- var is a
        var[3]                   -- 3-element array of
       *var[3]                   -- pointer to
      (*var[3])()                -- function taking 
      (*var[3])()                --   unspecified parameters 
     *(*var[3])()                -- returning pointer to
    (*(*var[3])())(          )   -- function taking
    (*(*var[3])())(          )   --   unnamed parameter is a
    (*(*var[3])())(      *   )   --   pointer to
    (*(*var[3])())(     (*)())   --   function taking
    (*(*var[3])())(     (*)())   --     unspecified parameters
    (*(*var[3])())(void (*)())   --   returning void
int (*(*var[3])())(void (*)());  -- returning int

So, var is a 3-element array of pointers to functions, each of which returns a pointer to another function (which takes a pointer to yet another function as an argument) that returns int.

3

solved Describe: int (*(*var[3])())(void (*)());