It seems the regular definition of the indirection operator doesn't apply when it is used on multi-dimensional arrays:
int arr[10][10][10];
If you dereference arr, you'll get the same address:
(void*)arr == (void*)*arr && (void*)*arr == (void*)**arr
This makes sense though - a multi-dimensional array is just a contiguous region of memory, where the pointer points at the beginning of the memory. The compiler essentially ignores dereferences and just computes the proper offset. Use of the indirection operator seems to only preserve the abstraction of multi-dimensional arrays and make it fit with the other syntactic constructs of the language.
If you do the following:
int *** ptr = (int***) arr;
And dereference ptr, you'll see the normal dereference behavior, where the value in the location specified by the pointer is returned. Using the above cast, you'll read into undefined memory if you dereference the pointer more than twice.
I'm just wondering why this behavior isn't documented in more places - that is, the difference of effect of the indirection operator on pointers to arrays vs pointers to pointers and pointers to values?