(a) int*p[3][3]
int a[3] is an array. It points to info at array[3]
It doesn't just point to information at array[3] (what do you mean by that?), it actually contains 3 integers (in the programming sense).
Code:
T name[N]
Are arrays with N elements of type T.
Code:
T name[N1][N2];
Are arrays of N1 elements of arrays of N2 elements of type T.
In your first case we have a 3-dimensional array, where each element is another 3-dimensional array in which each element is a pointer to an integer.
It's often called a 3x3 multi-dimensional array, one example use would be:
Code:
int x,y,z;
int* a[3][3];
a[0][0] = &x; // Set the very first element of both arrays to point to x
a[0][2] = &y; // Let the last element of the first array point to y.
a[2][2] = &z; // Let the last element in both arrays point to z
As for the second, either someone misunderstood the syntax of function pointers or they are trying to confuse you.
Code:
int*(*p())[10];
Just like last time, this is an array, so p is an array of 10 int*(*())
The outer set of parentheses means nothing in this code, so it's equivalent to:
Code:
int** ();
Which is just a function returning a pointer to a pointer to an integer. So p is an array of functions, but we don't have first-class functions in C or C++, so we end up with an unusable array.
What was most likely meant if this is real code is:
Code:
int*(*p)()[10];
Which is an array of 10 functions pointers, each pointing to a function returning a pointer to an integer and taking no arguments.