int *const p[];
// ( ^ )----Read this like a statement.
// ^----------------The returned value is of type int.[/code]
If you index p as an array you get a value, which if dereferenced as a constant pointer will return an int.
This is how it is implemented. If we wanted to group the pointer and array declaration with the type, there would be a much more natural way: (const* int)[] p; //p is an array of constant pointers to int
But someone decided that we do it the other way and we have for the last 30 years. Writing int* p only leads to confusion because it really means int(* p).