ВУЗ:
Составители:
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
- …
- следующая ›
- последняя »