Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект лекций -=Вычислительная техника и прог...docx
Скачиваний:
5
Добавлен:
01.05.2025
Размер:
1.84 Mб
Скачать

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

Многомерные массивы объявляются указанием каждого измерения в отдельных квадратных скобках (квадратные скобки синего цвета показывают, что инициализации массива может и не быть):

тип имя [индекс_1][индекс_2]…[индекс_N] [={инициализаторы}];

Двумерный массив имеет следующий формат объявления:

тип имя [индекс_строк][индекс_столбцов] [={инициализаторы}];

Пример:

Здесь объявляется массив из 5-ти строк и 4-х столбцов.

При инициализации многомерного массива он представляется либо как массив из массивов, либо задаётся общий список элементов в том порядке, в котором они располагаются в памяти.

Пример:

int matr[][] = { {1, 2} , {3, 4} , {5, 6} } ;

или

int matr[3][2] = {1, 2, 3, 4, 5, 6} ;

В памяти такой массив располагается построчно последовательно.

Многомерные массивы размещаются в памяти так, что при переходе к следующему элементу массива быстрее всего изменяется последний индекс.

Например, в выше приведенном примере инициализируется двумерный массив

,

который в памяти размещается следующим образом, как показано на рис. 3.2:

Рисунок 3.2 — Схема размещения двумерного массива

Для доступа к элементу многомерного массива следует указывать все его индексы.

Пример:

matr[i][j] ;

*(matr[i]+j) //или:

*(*(matr+i)+j)

3.5.3. Динамические массивы

3.5.3.1. Одномерные динамические массивы

Динамические массивы создают с помощью операции new (С++) или malloc (С).

Формат создания динамического массива с помощью операции new:

тип *имя = new тип [размер массива] ;

Пример:

int n=100 ; // количество элементов массива

float *p=new float[n] ; // объявление динамического массива

… // из n элементов с плавающей запятой

delete []p ; // освобождение памяти

Обращение к элементам динамического массива производится либо по индексу, либо через указатель.

Пример:

float a, b ;

a = p[5] ; // обращение к 5-му элементу массива

// с помощью индекса

b = *(p+5) ; // обращение к 5-му элементу массива

// через указатель

Формат создания динамического массива с помощью операции malloc:

тип *имя =

(приведение_типа *) malloc (размер_массива * размер_типа) ;

Пример:

int n = 100; //количество элементов массива

float *p = (float *) malloc(n*sizeof(float));

//объявление динамического массива

… //из n элементов с плавающей запятой

free(p); //освобождение памяти

Примечание:

1. Преобразование типа обязательно, поскольку функция malloc возвращает значение указателя типа void*.

2. Размер типа определять с помощью функции sizeof() необходимо, так как в некоторых случаях на некоторых ПК размер может отличаться от ожидаемого.

3.5.3.2. Динамический многомерный массив

Для создания динамического многомерного массива необходимо указать в операции new все его размерности.

Пример:

int N_str=5 ; //количество строк

int **m=(int**) new int [N_str][10] ; //объявление двумерного

//динамического массива

Более безопасный и универсальный способ создания массива, когда размерности задаются на этапе выполнения, показан на следующем примере:

int N_str, N_stb ; //1

cout<<''Введите количество строк и столбцов: '' ;

cin>>N_str>>N_stb ; //2

int **a=new int *[N_str] ; //3

for ( int i=0 ; i<N_str ; i++) //4

{

a[i]=new int[N_stb] ; //5

}

… /* Инициализация массива и обработка данных*/

delete []a; //6

В примере:

//1 — объявляется двух переменных — количества строк и столбцов;

//2 — ввод с клавиатуры количества строк и столбцов;

//3 — объявление указателя на массив указателей на int;

//4 — цикл для выделения памяти под каждую строку;

//5 — каждому элементу массива указателей на строки присваивается адрес начала участка памяти, выделенного под строку, как показано на рис. 3.3;

//6 — освобождение памяти из-под массива.

Рисунок 3.3 — Задание динамического многомерного массива

На рис. 3.3 отображены два этапа объявления и выделения памяти под двумерный массив:

— этап 1: объявляется указатель на массив указателей на int и выделяется память под массив указателей;

— этап 2: в цикле выделяется память под каждую строку массива, каждому элементу массива указателей на строки присваивается адрес начала участка памяти, выделенного под строку.