How is a multidimensional array defined in terms of a pointer to a collection of contiguous arrays of lower dimensionality ?
C does not have true multidimensional arrays. However, because of the generality of C's type system, you can have arrays of arrays.
Here is a two-dimensional array, although the techniques can be extended to three or more dimensions.
int a2[5][7];
Formally, a2 is an array of 5 elements, each of which is an array of 7 ints. Thus a two dimensional array, for example, is actually a collection of one dimensional arrays. Therefore, we can define a two-dimensional array as a pointer to a group of contiguous one dimensional arrays. A two dimensional array declaration can be written as
Int (*a2)[7];
We need parenthesis (*a2) since [] have a higher precedence than * So:
int (*a2)[7]; declares a pointer to an array of 7 ints.
int *a[7]; declares an array of 7 pointers to ints.
This concept can be generalized to higher dimensional arrays; that is
data - type (*variable name) [expression1][expression2].....[expression n];
If we don't know how many columns the array will have, we'll clearly allocate memory for each row (as many columns wide as we like) by calling malloc, and each row will therefore be represented by a pointer. To keep track of those pointers, we want to simulate an array of pointers, but we don't know how many rows there will be, either, so we'll have to simulate that array (of pointers) with another pointer, and this will be a pointer to a pointer.
This is best illustrated with an example:
#include
int **array;
array = malloc(nrows * sizeof(int *));
if(array == NULL)
{
fprintf(stderr, "out of memory\n");
exit or return
}
For (i = 0; i < nrows; i++)
{
array[i] = malloc(ncolumns * sizeof(int));
if(array[i] == NULL)
{
fprintf(stderr, "out of memory\n");
exit or return
}