Задача

1/1

Динамический массив: Начало

Теория Нажмите, чтобы прочитать/скрыть

Динамические массивы
В предыдущих курсах про массивы мы рассматривали создание массива таким образом:
 
const int Nmax = 1000;
int A[Nmax];

или таким:
int A[1000];

Такой способ создает статический массив. Одним из недостатков является то, что размер и тип элементов массива нельзя изменить во время работы программы. 
В рассмотренном выше примере, создается статический массив размерностью 1000 элементов. То есть в память выделяется участок для хранения 1000 элементов типа int (массив из 1000 элементов типа int). Адрес начала массива хранится в переменной A. Если понадобится обрабатывать массив более, чем из 1000 элементов, то придётся изменить описание и перекомпилировать программу заново. При работе с массивами небольшой размерности, большая часть памяти, выделенной под статический массив, будет использоваться вхолостую.

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

В С++ операции new и delete предназначены для динамического распределения памяти компьютера.  Операция new  выделяет память из области свободной памяти, а операция delete высвобождает выделенную память. 
 
Пример создания и удаление динамической переменной
int *A = new int;  // создаем объект типа int
*A = 15; // инициализация объекта происходит через указатель (*)
// инициализация может выполнятся сразу 
// при объявлении динамического объекта
int *B = new int(25);
cout << *A << " " << *B;  // выводим значение по указателю
delete A;  // освободили выделенную память
delete B;
Операция new создает объект заданного типа, выделяет ему память и возвращает указатель правильного типа на данный участок памяти. Если память невозможно выделить, например, в случае отсутствия свободных участков, то возвращается нулевой указатель, то есть указатель вернет значение 0. Выделение памяти возможно под любой тип данных: intfloat, doublechar и т. д.

Таким же способом, в С++ можно создавать динамический массив, который будет использовать динамическое выделение памяти. Размер такого массива которого можно в процессе работы программы, например с клавиатуры. Чаще всего операции new и delete применяются для создания динамических массивов, а не для создания динамических переменных.
 
В синтаксисе языка Си
int N;
scanf("%d", &N);
int *mas = malloc (sizeof(int) * N);   
// в дальнейшем для изменения размера массива
// используется realloc.
...
free(mas);   // освобождение выделенной памяти 


В синтаксисе языка C++
int N; 
cin >> N;
int* A = new int [N];  
// для изменения размера массива можно
// перенести данные в другой массив, а старый очистить
...
delete []mas;  // освобождение выделенной памяти 
// квадратные скобки говорят о том, 
// что мы освобождаем память из под массива

Задача

Дана последовательность, состоящая из целых чисел. Напишите программу, которая создает массив и записывает в него последовательность два раза подряд.
 
Входные данные 
Сначала задано число N — количество элементов в последовательности (1<= N <= 100). Далее через пробел записаны N чисел.
 
Выходные данные 
Необходимо вывести массив состоящий из продублированной последовательности.
 
Примеры
Входные данные Выходные данные
1 3
1 2 3
1 2 3 1 2 3