int (*p)[10] is a pointer to an array of 10 integers in each row i.e there can be any number of rows. basically it can be used to point to a 2D array and the dimensions can be accessed by incrementing i for *(p+i)[10] which is same as a[i][10], here 'i=1,2,3...' to access 1,2,3.. rows.
where as, int *p[10] is an array of 10 integer pointers.
If array is two dimesional i.e, for example
b[2][10]={{0,1,2,3,4,5,6,7,8,9},{10,11,12,13,14,15,16,17,18,19}};
basically,
(*ptr)[10] // where the higher dimension index is omitted i.e, 2 can be used as two dimensional pointer to an array(containing 10 elements in each row i.e, the 1st dimension) like (*ptr)[10] = &b.
In the printf("%d",(*ptr)[1]); as provided (*ptr) is same as *(ptr+0)evaluates to the first dimension i.e, b[0][0] which value is 0. like wise, to access the 2nd dimension of the array b[1][0] the expression will be **(ptr+1) or *(ptr+1)[0] or *(*(ptr+i)+j);
// where i=1 and j=0 gives the first element of the 2nd dimension i.e, 10.
I've answered it long so to understand it easy.