When declaring a variable, the type given is the type of any expression which looks like the declaration.
Thus, if we have the declarations
then, in the code, the expressions a, *b, c[] and *(*d[])() would all evaluate to an integer. Encountering this declaration one might find it challenging figuring out that
d
is an array of pointers to functions which return integer pointers,
but you do know what type it will evaluate to when used in the context given.
Thus you know that the statement
a = *(*d[5])(x, y)
will place an integer in a, even if you are not sure what happened.
You could similarly match types by stripping off matching levels of indirections:
b = (*d[5])(x, y)
would store an integer pointer in b rather than the value of the integer.