ВУЗ:
Составители:
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
M
-
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;
Страницы
- « первая
- ‹ предыдущая
- …
- 70
- 71
- 72
- 73
- 74
- …
- следующая ›
- последняя »
