Lets take it by an example:
int *p[N]; , where N is any integer number is a declaration for an array of N pointers of type int. This means that if we declare as:
int *p[5]; then, p[0], p[1]. … ,p[4] will all be pointers of type int, ie,, they point to memory locations allocated for integer data.
Coming to Pointer to an entire array can be declared as say:
int (*a)[N]; where N is any integer number.
This means that int (*a)[5]; is the declaration for a pointer to an array of length 5 of type int.
This is purely a matter of precedence. In the former case, for int *p[5]; Since [] has higher precedence that *, p is recognized as an array first and the * shows that it an array of integer pointers.
For the secod case, for int(*a)[5]; the default precedence is overridden by the common paranthesis. Thus, now a is a pointer first and the [] makes it a pointer to an array.

