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

ЯЗЫКИ ПОГРАММИРОВАНИЯ

Конспект лекции 26.03.2020

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

(здесь частично использован материал из открытых источников

«Уроки C++ с нуля» https://code-live.ru/post/cpp-dynamic-arrays/

«Язык программирования С++» http://cppstudio.com/post/432/)

 

Динамическое выделение памяти необходимо для эффективного использования памяти компьютера. Например, мы написали какую-то программку, которая обрабатывает массив. При написании данной программы необходимо было объявить массив, то есть задать ему фиксированный размер (к примеру, от 0 до 100 элементов). Тогда данная программа будет не универсальной, ведь может обрабатывать массив размером не более 100 элементов. А если нам понадобятся всего 20 элементов, но в памяти выделится место под 100 элементов, ведь объявление массива было статическим, а такое использование памяти крайне неэффективно.

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

int n = 10;int arr[n];

Но, как уже было сказано — при объявлении статического массива, его размером должна являться числовая константа, а не переменная. Кроме отдельных динамических объектов в языке C++ мы можем использовать динамические массивы. Для выделения памяти под динамический массив так же, как и в случае простой переменной, используется оператор new, после которого в квадратных скобках указывается, сколько массив будет содержать объектов.

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

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

 

Операция new создает объект заданного типа, выделяет ему память и возвращает указатель правильного типа на данный участок памяти. Если память невозможно выделить, например, в случае отсутствия свободных участков, то возвращается нулевой указатель, то есть указатель вернет значение 0. Выделение памяти возможно под любой тип данных: int, float,double, char и т.д.

Чаще всего операции new и delete применяются для создания динамических массивов, а не для создания динамических переменных.

Создание динамического массива покажем на примере.

Пример.

int *numbers = new int[4]; // динамический массив из четырех чисел

 

В этом случае оператор new также возвращает указатель на объект типа int - первый элемент в созданном массиве.

Приведенный пример определяет массив из четырех элементов типа int, но каждый из них имеет неопределенное значение. Однако мы также можем инициализировать массив значениями:

 

int *n1 = new int[4]; // каждый элемент имеет неопределенное значение

int *n2 = new int[4](); // каждый элемент имеет значение по умолчанию - 0

int *n3 = new int[4]{ 1, 2, 3, 4 }; // массив состоит из чисел 1, 2, 3, 4

 

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

 

Пример.

// пример использования операции new

int *ptrvalue = new int;

//где ptrvalue – указатель на выделенный участок памяти типа int

//new – операция выделения свободной памяти под создаваемый объект.

 

Пример.

#include <iostream>using namespace std; int main(){ int num; // размер массива cout << "Enter integer value: "; cin >> num; // получение от пользователя размера массива int *p_darr = new int[num]; // Выделение памяти для массива for (int i = 0; i < num; i++) {   // Заполнение массива и вывод значений его элементов    p_darr[i] = i;   cout << "Value of " << i << " element = " << p_darr[i] << endl; } delete [] p_darr; // очистка памяти return 0;}

Синтаксис выделения памяти для массива имеет вид:

 

указатель = new тип[размер];

 

В качестве размера массива может выступать любое целое положительное значение.

Пример.

#include <iostream>

 

int main()

{

std::cout << "Enter a positive integer: ";

int length;

std::cin >> length;

int *array = new int[length]; /* используем оператор new[] для выделения массива. Обратите внимание, переменная length не обязательно должна быть константой! */

std::cout << "I just allocated an array of integers of length " << length << '\n';

array[0] = 7; // присваиваем элементу под номером 0 значение 7

delete[] array; /* используем оператор delete[] для освобождения выделенной для массива памяти; об этом я расскажу чуть позже*/

array = 0; // используйте nullptr вместо 0 в C++

return 0;

}

 

Поскольку мы выделяем массив, то C++ понимает, что он должен использовать другую форму оператора new — форму для массива, а не для переменной. По факту вызывается оператор new[], даже если мы и не указываем [] сразу после ключевого слова new.

 

Обратите внимание, поскольку память для динамических массивов выделяется из другого резерва, чем память, используемая для фиксированных массивов, то размер массива может быть довольно большим. Вы можете запустить программу, приведенную в примере выше, и выделить массив длиной 1 000 000 (или, возможно, даже 100 000 000) без проблем. Попробуйте!

 

Пример. Разработаем программу, в которой будет создаваться динамическая переменная.

#include "stdafx.h"

#include <iostream>

using namespace std;

 

int main(int argc, char* argv[])

{

 int *ptrvalue = new int; // динамическое выделение памяти под объект типа int

 *ptrvalue = 9; // инициализация объекта через указатель

 /* int *ptrvalue = new int (9); инициализация может выполнятся сразу при объявлении динамического объекта */

 cout << "ptrvalue = " << *ptrvalue << endl;

 delete ptrvalue; // высвобождение памяти

 system("pause");

return 0;

}

 

В строке 10 показан способ объявления и инициализации значением "девять" динамического объекта: все, что нужно, так это указать значение в круглых скобочках после типа данных.

Результат работы программы:

 

ptrvalue = 9

Для продолжения нажмите любую клавишу …

 

 


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: