Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

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



Читайте также:
  1. RAID-массивы и матрицы
  2. Двумерные массивы
  3. ДВУМЕРНЫЕ МАССИВЫ
  4. Двумерные массивы
  5. ДВУМЕРНЫЕ МАССИВЫ
  6. Двумерные массивы
  7. Двумерные массивы

В динамической области памяти можно создавать двумерные массивы с помощью операции 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 [].


Дата добавления: 2015-07-11; просмотров: 62 | Нарушение авторских прав






mybiblioteka.su - 2015-2024 год. (0.009 сек.)