int *a[10] declare a as an array of 10 pointers to int.
int (*a)[10] declare a as a pointer to an array of 10 ints.  
Remember these two rules to decipher pointer declarations:
- Always read declarations from inside out: Start from innermost, if any, parenthesis. Locate the identifier that's being declared, and start deciphering the declaration from there. 
- When there is a choice, always favour [] and () over - *: If- *precedes the identifier and- []follows it, the identifier represents an array, not a pointer. Likewise, if- *precedes the identifier and- ()follows it, the identifier represents a function, not a pointer. (Parentheses can always be used to override the normal priority of- []and- ()over- *).
 
For example:
int *a[10];      "a is"  
     ^  
int *a[10];      "a is an array of 10"  
      ^^^^ 
int *a[10];      "a is an array of 10 pointers"
    ^
int *a[10];      "a is an array of 10 pointers to `int`".  
^^^