Освобождение памяти, занятой элементами динамического массива




Объявление и инициализация массивов

Синтаксис объявления массива выглядит следующим образом:

тип идентификаторМассива [размерность] = {значение элемента 0, …, значение элемента N};

Здесь под «типом » понимается тип данных одного элемента массива, которые будут храниться в массиве. Под «размерностью » понимается общее количество элементов массива. Размерность может быть задана только положительной константой или константным выражением.

Так как индексация массива начинается с 0, то последний элемент массива будет иметь номер, на единицу меньший размерности, заданной при его описании. В том случае, когда при описании массива не задана размерность, должен присутствовать инициализатор. В таком случае компилятор выделит память в соответствии с количеством инициализирующих значений. Также, размерность может быть опущена в списке формальных параметров.

Здесь продемонстрирован способ инициализации массива, который заключается в явном перечислении значений, присваиваемых каждому отдельному элементу. В том случае, когда количество инициализируемых значений, которые указаны в фигурных скобках, меньше чем общее количество элементов массива, элементам, которым не было присвоено значение будет соответствовать «0».

Примеры объявления и инициализации массивов:

Пример 1. Инициализация группой значений. chara[8] = {“a”, “b”, “c”, “d”, “e”, “f”, “g”};
Пример 2. Инициализация одним значением. intb[9] = {0};
Пример 3. Использование массивов. // подсчитывается сумма элементов массива #include <iostream.h> int main(){ const int n = 10; int i, sum; int mas[n] = {3, 4, 5, 4, 4}; for (i = 0, sum = 0; i<n; i++) sum += mas[i]; cout << "Сумма элементов: " << sum; return 0; }

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

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

Под идентификатором массива понимается константный указатель на его нулевой элемент. Для массива из предыдущего листинга имя mas — это то же самое, что &mas[0], а к i-му элементу массива можно обратиться, используя выражение *(mas+i).

Можно описать указатель, присвоить ему адрес начала массива и работать с массивом через указатель.

Пример 4. Использование указателей для работы с массивами. // программа копирует все элементы массива a в массив b int а[100], b[100]; int *pa = а; // или int *pа = &а[0]; int *pb = b; for(int i=0; i<100; i++) *pb++ = *pa++; // или pb[i] = pa[i];

 

Пример 5. Создание динамического массива. int n = 100; float *рtr = new float [n];

Применительно к примеру выше, создание динамического массива проходит в три шага:

    1. создание указателя на float;
    2. в динамической памяти отводится непрерывная область, для размещения 100 элементов вещественного типа;
    3. адрес её начала записывается в указатель ptr.

Доступ к элементам динамического массива осуществляется точно также, как к статическим. например, к элементу номер 5 приведенного выше массива можно обратиться как р[5] или *(р+5).

Второй способ создания динамического массива заключается в использовании функции malloc.

Пример 6. Создание динамического массива с помощью функции malloc. int n = 100; float *q = (float *) malloc(n * sizeof(float));

Здесь операция преобразования типа, записанная перед обращением к функции malloc ((float *)), требуется потому, что функция возвращает значение указателя тина void*, а инициализируется указатель на float.

Освобождение памяти, занятой элементами динамического массива

Память, зарезервированная под динамический массив с помощью new[], должна освобождаться оператором delete[], память, выделенная функцией malloc — посредством функции free. При несоответствии способов выделения и освобождения памяти результат не определен. Размерность массива в операции delete не указывается, но квадратные скобки обязательны.

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

Описанные выше массивы называются одномерными, так как положение одного элемента в нём описывается одним индексом. В многомерных массивах положение одного элемента определяется значением нескольких индексов. Таким образом, можно ввести общую форму объявления массива, которая представлена следующим образом:

тип идентификаторМассива [размерность_1][…][размерность_N];

В памяти компьютера элементы многомерного массива располагаются в порядке возрастания их адресов. Таким образом, массив состоящий из двух строк и трёх столбцов будет расположен в памяти следующим образом:

 

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

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

Так, например, если мы имеем массив, состоящий из 5-ти строк и 3-х столбцов, которые хранят значения типа short int, то:

· Количество элементов в массиве = 5*3 = 15;

· Количество памяти, отводимое под массив = 15*2 (байта) = 30 байт.

Инициализировать массив можно ровно тем же способом, которым инициализировался одномерный массив, т.е. путём перечисления значения элементов в фигурных скобках.

Пример 7. Объявление и инициализация двумерного массива inta[2][3] = {0, 1, 2, 3, 4, 5} /*общий список элементов в порядке расположения элементов в памяти*/ inta[][2] = {{0, 1}, {1, 0}, {1, 1}}; /*массив массивов, при этом каждый массив заключается в фигурные скобки*/

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

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

Пример 8. Создание многомерного динамического массива. int nstr = 5; int **m = (int **) new int [nstr][10];

Самая левая размерность может быть переменной.

Для осуществления доступа к определённому элементу многомерного массива используются все его индексы в том же формате, что и для одномерных массивов. Однако, здесь можно воспользоваться и более экзотическим способом организации доступа к элементу.

Пример 9. Доступ к элементам многомерного массива. int matr [6][8]; matr[1][5]=7; /*поскольку matr[i] является адресом начала i-й строки, справедлив следующий способ организации доступа к элементу*/ *(matr[1]+5)=7; //или *(*matr+1)+5)=7;


Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2021-12-14 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: