Составители:
В некоторых книгах по Си рекомендуется реализовывать матрицу как массив указателей на ее строки, при
этом память под каждую строку захватывается отдельно в динамической памяти:
double **a; // Адрес массива указателей
int m, n; // Размеры матрицы: m строк, n столбцов
int i;
. . .
// Захватывается память под массив указателей
a = (double **) malloc(m * sizeof(double *));
for (i = 0; i < m; ++i) {
// Захватывается память под строку с индесом i
*(a+i) = (double *) malloc(n * sizeof(double));
}
После этого к элементу a
ij
можно обращаться с помощью выражения
*(*(a+i)+j)
Несмотря на всю сложность этого решения, никакого выигрыша нет, наоборот, программа проигрывает в
скорости! Причина состоит в том, что матрица не хранится в непрерывном участке памяти, это мешает как
оптимизации программы, так и эффективному использованию кеш-памяти. Так что лучше не применять такой
метод представления матрицы.
Многомерные массивы реализуются аналогично матрицам
. Например, вещественный трехмерный массив
размера 4 × 4 × 2 описывается как
double a[4][4][2];
обращение к его элементу с индексами x, y, z осуществляется с помощью выражения
a[x][y][z]
Многомерные массивы переменного размера с числом индексов большим двух встречаются в программах
довольно редко, но никаких проблем с их реализацией нет: они реализуются аналогично матрицам. Например,
пусть надо реализовать трехмерный вещественный массив размера m × n × k. Захватывается линейный массив
вещественных чисел размером m * n * k:
double *a;
. . .
a = (double *) malloc(m * n * k * sizeof(double));
Доступ к элементу с индексами x, y, z осуществляется с помощью выражения
a[(x * n + y) * k + z]
§ 2. Представление матриц и многомерных массивов на языке Pascal
В Паскале двумерный массив представляется массивом, элементами которого являются одномерные массивы.
Два следующих описания двумерных массивов тождественны:
Type
Vector = array [1..5] of <тип_элементов>;
Matrix= array [1..10] of vector;
Var m: matrix;
Type
Matrix= array [1..5] of array [1..10] of < тип элементов >;
или еще проще:
type
matrix = array [1..5, 1..10] of <тип элементов>;
Чаще всего при описании двумерного массива используют второй способ. Доступ к каждому отдельному
элементу осуществляется обращением к имени массива с указанием индексов (первый индекс – номер строки,
второй индекс – номер столбца).
Страницы
- « первая
- ‹ предыдущая
- …
- 44
- 45
- 46
- 47
- 48
- …
- следующая ›
- последняя »
