array []: It is array of pointer to such function which parameter is void and return type is int data type.ptr: It is pointer to array which contents are pointer to such function which parameter is void and return type is int type data.
Here ptr: is pointer to array of pointer to string.P1, p2, p3: are pointers to array of string.array[3]: is array which contain pointer to array of string.As we know p[i]=*(p+i)
p=&a[2][2][2] you declare only two 2D arrays, but you are trying to access the third 2D(which you are not declared) it will print garbage values. *q=***a starting address of a is assigned integer pointer. Now q is pointing to starting address of a. If you print *q, it will print first element of 3D array.
array [2][3][3]:It is three dimensional array and its content are constant integers.ptr: It is pointer to such three dimensional array whose content are constant integer.
*(*(*ptr) [1] +2)
=*(*(*&array) [1] +2)
=*(*array [1] +2)
=*(array [1] [0] +2)
=array [1] [0] [2]
I.e. array element at the 1*(3*3) +0(3) + 2=11th position starting from zero which is 11.