Языки программирования для численных методов. Глушакова Т.Н - 72 стр.

UptoLike

72
размера N*sizeof(тип ) байт), после этого полученный
указатель можно индексировать , обращаясь к нему как к обычному
массиву . Надо только не забыть освободить память , когда массив
становится не нужен. Если при работе окажется , что размер массива
недостаточный, его можно увеличить при помощи функции realloc.
С многомерными динамическими массивами ситуация сложнее: мы
не можем выделить непрерывный участок памяти и правильно
индексировать его несколькими индексами. Например, чтобы правильно
обработать индексы [i][j], компилятор должен знать , сколько элементов в
каждой строке двумерного массива, а в конструкции [i][j] такой
информации нет (в п. 6.3 эта проблема уже обсуждалась ). Когда массив
статический , компилятор может взять эту информацию из его описания
( например, в массиве int m[5][10] в каждой строке по 10 элементов).Для
динамического массива такого способа нет.
Однако сымитировать многомерный динамический массив можно
через массив указателей . Рассмотрим указатель на указатель double **m.
Если выделить динамически память под N указателей на double, а для
каждого их этих указателей выделить память под M элементов типа double,
мы получим следующую схему:
То есть мы как бы имеем матрицу NxM, где каждая из N строк
хранится в виде отдельного массива, на который указывает
соответствующий элемент вспомогательного массива указателей m. И
индексирования m[i][j] всегда будет работать правильно !
Таким образом, через массив указателей мы можем сымитировать
двумерный динамический массив .
Код, который выделяет память под него, может выглядеть так :
typedef double **DynMatrix;
m
0
i
N
-
1
0
-
1
                                    72
размера N*sizeof(тип) байт),          после    этого     полученный
указатель можно индексировать, обращаясь к нему как к обычному
массиву. Надо только не забыть освободить память, когда массив
становится не нужен. Если при работе окажется, что размер массива
недостаточный, его можно увеличить при помощи функции realloc.
      С многомерными динамическими массивами ситуация сложнее: мы
не можем выделить непрерывный участок памяти и правильно
индексировать его несколькими индексами. Например, чтобы правильно
обработать индексы [i][j], компилятор должен знать, сколько элементов в
каждой строке двумерного массива, а в конструкции [i][j] такой
информации нет (в п. 6.3 эта проблема уже обсуждалась). Когда массив
статический, компилятор может взять эту информацию из его описания
(например, в массиве int m[5][10] в каждой строке по 10 элементов).Для
динамического массива такого способа нет.
      Однако сымитировать многомерный динамический массив можно
через массив указателей. Рассмотрим указатель на указатель double **m.
Если выделить динамически память под N указателей на double, а для
каждого их этих указателей выделить память под M элементов типа double,
мы получим следующую схему:



                     0
           m
                     i

                                         0         M-1

                    N-1


     То есть мы как бы имеем матрицу NxM, где каждая из N строк
хранится в виде отдельного массива, на который указывает
соответствующий элемент вспомогательного массива указателей m. И
индексирования m[i][j] всегда будет работать правильно!
     Таким образом, через массив указателей мы можем сымитировать
двумерный динамический массив.
     Код, который выделяет память под него, может выглядеть так:
     typedef double **DynMatrix;