Okay let's say that we have an 3x3 array of int*.
Now since the array (a 3x3 array of int*) needs to be dereferenced 3 times (***) to get the value of an int that one of the elements hold the address to, this must mean that just having the array name point to the first element of row one can't be possible because then only 2 levels of indirection would be needed to gain access to an int value. This must mean (for this individual example, a 3x3 int* array), that 3 additional pointers will be needed. These additional pointers (to pointers, int**) will hold the address of the first pointers in each row of the array. The actual array name will hold the address of the first of the previous 3 pointers (this pointer, an int***) and each of the 3 previous pointers being next to each other in memory (so that pointer arithmetic can take place).
Now this is just how I see it as working. Is this even correct? (If not I would like to know how this actually works..)
Now if this is correct, I already see that the same thing would be needed for a simple 2D array of int (rather than int*), except step each pointer level down 1 notch..