I understand that arrays in C are allocated in row-major order. Therefore, for a 2 x 3 array:
0 1
2 3
4 5
Is stored in memory as
0 1 2 3 4 5
However, what if I have a 2 x 3 x 2 array:
0 1
2 3
4 5
and
6 7
8 9
10 11
How are these stored in memory? Is just consecutive like:
0 1 2 3 4 5 6 7 8 9 10 11
Or is it some other way? Or does it depend on something?
I think you have answered your own question. Multi-dimensional arrays are stored in row-major order.
See ANSI C specification section 3.3.2.1 (there is also a specific example):
For your example, you can just try it out and see - http://codepad.org/10ylsgPj
3d array is an extended 2d array.
For example we have an array - int arr(3)(5)(6);
This is an array which consists of two 2d arrays where array would have a 2d array having 4 rows and 3 columns.
At a low level, there is no such thing as a multi-dimensional array. There is just a flat block of memory, large enough to hold a given number of elements. In C, a multi-dimensional array is conceptually an array whose elements are also arrays. So if you do:
Conceptually you end up with:
This results in the elements being arranged contiguously in memory, because
array[0]
andarray[1]
are not actually holding any data, they are just references to the two inner arrays. Note that this means that only the[0, 1, 2]
entries actually occupy space in memory. If you extend this pattern out to the next dimension, you can see that:...will give you a structure like:
Which continues arranging the elements consecutively in memory (as above, only the
[0, 1]
entries actually occupy space in memory, everything else is just part of a reference to one of these entries). As you can see, this pattern will continue no matter how many dimensions you have.And just for fun:
Gives you:
To answer OP's comment to the main question (it will be somewhat long, so I decided to go with an answer, not a comment):
In math, a MxN matrix has M rows and N columns. A usual notation for a matrix element is
a(i,j), 1<=i<=M, 1<=j<=N
. So the first matrix in your question is a 3x2 matrix.Indeed it is different from the notation typically used for e.g. GUI elements. A 800x600 bitmap has 800 pixels horizontally (along X axis) and 600 pixels vertically (along Y axis). If some would want to describe it as a matrix, in math notation it would be a 600x800 matrix (600 rows, 800 columns).
Now, multidimensional arrays in C are stored in memory in such a way that
a[i][j+1]
is next toa[i][j]
whilea[i+1][j]
is N elements away. It is usually said that "the last subscript varies fastest", or often as "stored by rows": a row (i.e. elements with same first index) in a 2-dimensional matrix has placed contiguously in memory while a column (same second index) consist of elements lying far away from each other. It is important to know for performance considerations: access to neighbor elements is usually much faster (due to HW caches etc.), so for example nested loops should be organized such that the innermost one iterates over the last index.Back to the question: if your mental picture (abstraction) of a 2D array is that of a lattice in Carthesian coordinates, then yes, you may think of it as
array[NY][NX]
in C. However if you need to describe real 2D or 3D data as an array, the choice of indexes probably depends on other things: data formats, convenient notation, performance, etc. For example, if the in-memory representation for a bitmap isarray[NX][NY]
in a format you need to work with, you will declare it that way, and maybe you don't even need to know that the bitmap becomes sort of "transposed" :)Yep, you're right - they are stored consecutively. Consider this example:
Output:
0 1 2 3 3 4 5 6 7 8 9 10
All "dimensions" are stored consecutively in memory.
Consider
you can say that
arr[1]
andarr[2]
(of typeint[100][20]
) are contiguousor that
arr[1][42]
andarr[1][43]
(of typeint[20]
) are contiguousor that
arr[1][42][7]
andarr[1][42][8]
(of typeint
) are contiguous