The way that derived declarations work is that you replace the identifier in the declaration with the new thing you are deriving. For example in the first step here, to get from "pointer to int[3]" to "function returning pointer to int[3]", we take the declaration for "pointer to int[3]", and change the identifier to be a function declarator.
A pointer to int[3]: int (*name)[3];
A function returning that: int (* name() )[3];
A pointer to that: int (* (*name) () )[3] - parentheses required otherwise the *
binds to the other *
instead of to name
A function returning that: int (* (* name() ) () )[3]