So, what is the difference between ** and [x][y]? Well, one is a static memory location and the other are pointers.
float **x;
float y[10][3];
x is a pointer to a pointer. So, what the compiler does it it goes to the address of the variable X. It then reads this address and then goes to the address stored at that location. It then uses this address as the place to store the float! If you understand single pointers you can see how the double pointer works:
First Address = *x;
Second Address = *First Address;
The Actual Float Value = *Second Address;
At any level you can actually allocate a "block" of pointers that you can index into at that time. So what's the difference with an array?
y\[1\]\[2\] = 12;
Is actually
y\[3 + 2\] = 12;
It's a single block of memory! There are no pointers! In the case of even a single float *, the address of the variable stores the address that then stores the actual value! In the case of an array, the address of the variable stores the actual value! So, a multi-dimentional pointer is actually a single block of memory that is then index by the compiler as one block. So if you have: rows by columns: float x[row][column] each row is maxcolumns size. So if you want to go to rowx, coly, you could simply do rowx*maxcolumns + coly. This would index that block of memory. The compiler knows how to generate the correct code if it's an array or pointer. Remember, an array's address stores the actual data. The pointer's address, stores another address. That address then stores the data (in a single indirection case). 8bc7c0ec02c0e404c0cc0680f7018827ebee