This explanation might help.
Array[a]
will address this kind of matrix:
[0][1][2][3][4]
------->
which is basically a numbered line going right and growing in value.
In the C two dimensional array...
Array[a][b]
The first parameter [a] is going in the same direction, its the same array, but [b] adds a new dimension to it.
b=0 >> [a=0][a=1][a=2][a=3][a=n]
b=1 >> [a=0][a=1][a=2][a=3][a=n]
b=2 >> [a=0][a=1][a=2][a=3][a=n]
b=n >> [a=0][a=1][a=2][a=3][a=n]
The grid created by this causes the first parameter to behave like X on a cartesian plane going towards the right from 0, while the second parameter adds equal length rows below it and continuing downward stopping at your array's limit. This would be Y going in the negative direction starting from 0.
Now, the point I made earlier is that arrays, being it is in computer memory, is a linear allocation of memory, the reality is that the "shape" of the array is physically like this:
Array[2][3]
[0,0][1,0][0,-1][1,-1][0,-2][1,-2]
-------->
NOTE: This is in the cartesian convention, in C it would not be negative numbers.
Physically, all the data "plotted" on these points are in fact strung together in a line.
So unless you are interested in accessing the array by pointer, there really isn't any reason to consider the C array to be [x][y] or [y][x], because there is nothing in the structure of C that even remotely makes it cartesian compatible. So the definition you use in your program for the MEANING of the two parameters in the C array will always be correct as long as you stay consistent.