What is the difference between int *a[3] and int (*a)[3]?
It seems like your asterisks are lost in the formatting...
int *a[3]
declares an array of 3 int*.
int (*a)[3]
declares a as a pointer to a vector of ints. This is really not much different from any other pointer, it just points to a somewhat more complicated type.
int foo[3];
int bar[3];
int (*vp)[3];
vp = &foo;
(*vp)[0] = 0;