Учебное пособие Самара 2015 + 004. 43 Ббк 32. 973 Н 19


Download 1.98 Mb.
bet15/53
Sana15.08.2023
Hajmi1.98 Mb.
#1667321
TuriУчебное пособие
1   ...   11   12   13   14   15   16   17   18   ...   53
Bog'liq
Lekcii AiSD 2015

Многомерные массивы

В языках Си/Си++ считается, что массивы имеют только одну размерность. Многомерные массивы представляются масси- вами указателей на массивы (или массивами массивов).


43
Двумерные массивы как структуры данных на логическом уровне представляются матрицей значений. Массивы большей размерности представляются параллелепипедом (или набором матриц), «гиперпараллелепипедом» (набором наборов матриц) и т.д. В этой связи подобные структуры данных называют прямо- усольпытп. Поскольку память ЭВМ представляет собой линей- ную (т.е., фактически, одномерную) последовательность ячеек с уникальными адресами, то на фпзпчегкаж уровне существует сложность представления массивов с размерностью большей единицы. Такие массивы представляются массивами одномерных массивов, фактически, массивами указателей на одномерные мас-
СИВЫ.
В случае двумерного массива, т.е. матрицы, в каждом одно- мерном массиве такого массива указателей на массивы хранятся элементы столбцов или строк матрицы. Выбор столбцов или строк определяется языком программирования. Для языков Си/Си++ это будут строки. Для трехмерного массива параллеле- пипед раскладывается на слои, каждый из которых является мат- рицей. Реально, слой — это указатель на матрицу, все слои — мас- сив указателей на матрицы. В свою очередь, матрица — массив указателей на векторы. Таким образом, для доступа к элементам многомерных (и одномерных) массивов могут использоваться указатели. Такой способ доступа будет рассмотрен ниже.
В языках Си/Си++ многомерные массивы определяются следующим образом.
int foxtrot[5] [20];

Элементы двумерного массива хранятся по строкам, т.е. ec- ли проходить по ним в порядке их расположения в памяти, то быстрее всего изменяется крайний правый индекс. То же спра- ведливо и для массивов большей размерности.


При инициализации многомерных массивов соблюдаются те же соглашения, что и при инициализации одномерных массивов, за исключением того, что можно не указывать размер только по первой (самой левой) размерности:
int b[] [2]={{1,2},{3,4},{5,6}}; // b[3] [2]

44
Если заданы все значения, то внутренние скобки могут отсутст-


ВоВаТь.
int d[] [2]={{1},{2},{3}};
int с[] [2]={1,2,3,4,5,6};

Имя любого массива, как одно-, так и многомерного, само по себе является адресом начального (т.е. нулевого) элемента этого массива и, одновременно, константой, т.е. константным указателем.


foxtrot - &foxtrot[0] [0]

В таком качестве имя массива может использовать везде, где использовался бы константный указатель. Единственным ис- ключением является использование имени массива в операции sіz ееf . Результатом операции в этом случае будет число байт, занимаемых всем массивом, а не указателем.


Многомерный динамической масснв может быть создан в языке Си++ по крайней мере двумя способами. Мервый cnocod:
char ( * raml ) ( 512 ] ; / / Указатель на символьный
массив из 512 элементов
int SizeY = 40;
mind = new char SizeY ] [ 512 ) ; / / Двумерный ди-
намический символьный массив

В этом способе обязательно должен использоваться указатель на массив (1-, 2- или многомерный, в зависимости от конечной раз- мерности) и только первый (самой левый) размер создаваемого массива может быть задан при помощи переменной.


long (*lp) [3][4];
lp = new long[SizeY] [3][4];

Удаляются такие динамические массивы также, как одно- мерные:


delete [] raml; delete [] lp;


Второй способ является более гибким и допускает исполь- зование переменных по всем размерностям.

45
int height = 256, width = 512; //Высотаиіинрнна


матрицы
uns iqned char * * ram; // Указатель на указатель (для 2-
мерного массива)
ram=new onsiqned char * [heiqhL ) i // Создание од—
номерного массива указателей
for(int i = 0; i < height; ++i)
ram[i] = new unsigned char[width]; //Создание
СТ]ЭОК — ОДНОМ ]ЭНЫХ М tCGИBOB

Каждый одномерный массив-строка может быть неодинакового размера.


Удаление двумерного динамического массива, созданного таким способом, выполняется следующим образом:
for(int i = 0; i < height; i++) delete[] ram[i];
delete [] ram;

Операции создания и удаления двумерного динамического массива относятся к линейным алгоритмам.






    1. Download 1.98 Mb.

      Do'stlaringiz bilan baham:
1   ...   11   12   13   14   15   16   17   18   ...   53




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling