Многомерные массивы могут быть построены динамически, используя
указатели на указатели с malloc. В приведенном ниже примере, один
указатель на указатель на int объявлен. После объявления
Указатель не имеет значимого значения. Затем вызов Mallac просит
указатель указывает на блок из nx действительных единиц памяти:
x = (int **) malloc(nx * sizeof(int *));
После этого вызова x теперь имеет допустимое значение; в частности,
начальный адрес блока памяти, который содержит nx
указатели-к-междунар. Каждый из этих указателей на int просто обычный
указатель, как мы видели много раз. Им еще предстоит
инициализированы к чему-либо значимому, и каждый может быть доступен
как либо
x[0], x[1] ... x[nx-1], OR *x, *(x+1), *(x+2),
... *(x+nx-1).
Чтобы придать каждому из этих указателей значимое значение,
мы можем вызвать malloc для каждого из них, например,
этот цикл:
for (i=0;i<nx;++i){
x[i] = ( int * ) malloc( ny * sizeof(int));
}
Обратите внимание, что мы могли бы также сказать:
for (i=0;i<nx;++i){
*(x+i) = ( int * ) malloc( ny * sizeof(int));
}
Теперь, когда каждый указатель в нашем массиве указателей указывает на
значимый блок памяти (каждый размером ny ints) мы можем назначить
ценности. Чтобы понять, как присваиваются значения, рассмотрите
Схема ниже. Вам нужно будет изучить это очень тщательно, пока
это очень ясно, что происходит. Это может быть немного сложно, но
как только вы это освоите, все будет не так плохо.
x[0] ---> | *x[0] | *x[0]+1 | *x[0] + 2 | ... | *x[0]+ny-1 |
x[1] ---> | *x[1] | *x[1]+1 | *x[1] + 2 | ... | *x[1]+ny-1 |
.
.
.
x[nx-1] ---> | *x[nx-1] | *x[nx-1]+1 | *x[nx-1] + 2 | ... | *x[nx-1]+ny-1 |
Это эквивалентно:
x[0] ---> | *(*(x+0)+0) | *(*(x+0)+1) | *(*(x+0)+2) | ... | *(*(x+0)+ny-1) |
x[1] ---> | *(*(x+1)+0) | *(*(x+1)+1) | *(*(x+1)+2) | ... | *(*(x+1)+ny-1) |
.
.
.
x[nx-1] ---> | *(*(x+nx-1)+0) | *(*(x+nx-1)+1) | *(*(x+nx-1)+2) | ... | *(*(x+nx-1)+ny-1) |
И это эквивалентно:
x[0] ---> | x[0][0] | x[0][1] | x[0][2] | ... | x[0][ny-1] |
x[1] ---> | x[1][0] | x[1][1] | x[1][2] | ... | x[1][ny-1] |
.
.
.
x[nx-1] ---> | x[nx-1][0] | x[nx-1][1] | x[nx-1][2] | ... | x[nx-1][ny-1] |
... учитывая важное соотношение:
*( *(x + i) + j) = *( x[i] + j) = x[i][j]