Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
4_Двумерные массивы.doc
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
637.95 Кб
Скачать

1.2 Динамические массивы

В динамической области памяти можно создавать двумерные массивы с помощью операции new или функции malloc. Остановимся на первом варианте, поскольку он более безопасен и прост в использовании.

При выделении памяти сразу под весь массив количество строк (самую левую раз­мерность) можно задавать с помощью переменной или выражения, а количество столбцов должно быть константным выражением, то есть явно определено до вы­полнения программы. После слова new записывается тип создаваемого массива, а за­тем его размерности в квадратных скобках (аналогично описанию «обычных», нединамических массивов), например:

int n;

const int m = 5;

cin >> n;

int (*a)[m] = new int [n][m]; // 1

int ** b = (int **) new int [n][m]; // 2

В этом фрагменте показано два способа создания динамического массива. В опе­раторе 1 адрес начала выделенного с помощью new участка памяти присваивается переменной а, определенной как указатель на массив из m элементов типа int. Имен­но такой тип значения возвращает в данном случае операция new. Скобки необхо­димы, поскольку без них конструкция интерпретировалась бы как массив указателей. Всего выделяется n элементов.

В операторе 2 адрес начала выделенного участка памяти присваивается перемен­ной b, которая описана как «указатель на указатель на int», поэтому перед присва­иванием требуется выполнить преобразование типа.

Строго говоря, по стандарту в этом случае рекомендуется применять другую опе­рацию преобразования типа, но старые компиляторы могут ее не поддерживать:

int ** b = reinterpret_cast<int **> (new int [n][m]);

Обращение к элементам динамических массивов производится точно так же, как к элементам «обычных», с помощью конструкции вида a[i][j].

Для того чтобы понять, отчего динамические массивы описываются именно так, нужно разобраться в механизме индексации элемента массива, рассмотренном выше. Поскольку для доступа к элементу массива применяется две опе­рации разадресации, то переменная, в которой хранится адрес начала массива, долж­на быть указателем на указатель.

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

int nrow, ncol;

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

cin >> nrow >> ncol;

int **a = new int *[nrowj; // 1

for(int i = 0; i < nrow; i++) // 2

a[i] = new int [ncol]; // 3

В операторе 1 объявляется переменная типа «указатель на указатель на int» и вы­деляется память под массив указателей на строки массива (количество строк nrow). В операторе 2 организуется цикл для выделения памяти под каждую строку массива. В операторе 3 каждому элементу массива указателей на строки присваи­вается адрес начала участка памяти, выделенного под строку двумерного массива. Каждая строка состоит из ncol элементов типа int (рис. 3).

Рис. 3. Схема динамической области памяти, выделяемой под массивы

ВНИМАНИЕ: Освобождение памяти из-под массива с любым количеством измерений выполняется с по­мощью операции delete [].