После создания динамического массива мы сможем с ним работать по полученному указателю, получать и изменять его элементы.
Пример.
int n = 5; // размер массива
int *p = new int[n]{ 1, 2, 3, 4, 5 };
for (int *q = p; q!= p + n; q++)
{
std::cout << *q << "\t";
}
Рассмотрим фрагмент кода создания одномерного динамического массива.
// объявление одномерного динамического массива на 10 элементов:
float *ptrarray = new float [10];
// где ptrarray – указатель на выделенный участок памяти под массив вещественных чисел типа float
// в квадратных скобочках указываем размер массива
После того как динамический массив стал ненужным, нужно освободить участок памяти, который под него выделялся:
// высвобождение памяти, отводимой под одномерный динамический массив:
delete [] ptrarray;
После оператора delete ставятся квадратные скобочки, которые говорят о том, что высвобождается участок памяти, отводимый под одномерный массив.
Пример. Разработаем программу, в которой создадим одномерный динамический массив, заполненный случайными числами.
|
|
#include "stdafx.h"
#include <iostream>
// в заголовочном файле <ctime> содержится прототип функции time()
#include <ctime>
// в заголовочном файле <iomanip> содержится прототип функции setprecision()
#include <iomanip>
using namespace std;
int main(int argc, char* argv[])
{
srand(time(0)); // генерация случайных чисел
float *ptrarray = new float [10]; /* создание динамического массива вещественных чисел на десять элементов*/
for (int count = 0; count < 10; count++)
ptrarray[count] = (rand() % 10 + 1) / float((rand() % 10 + 1)); /*заполнение массива случайными числами с масштабированием от 1 до 10*/
cout << "array = ";
for (int count = 0; count < 10; count++)
cout << setprecision(2) << ptrarray[count] << " ";
delete [] ptrarray; // высвобождение памяти
cout << endl;
system("pause");
return 0;
}
Созданный одномерный динамический массив заполняется случайными вещественными числами, полученными c помощью функций генерации случайных чисел, причём числа генерируются в интервале от 1 до 10, интервал задается так — rand() % 10 + 1. Чтобы получить случайные вещественные числа, выполняется операция деления, с использованием явного приведения к вещественному типу знаменателя — float((rand() % 10 + 1)). Чтобы показать только два знака после запятой используем функцию setprecision(2), прототип данной функции находится в заголовочном файле <iomanip>. Функция time(0) присваивает параметрам генератора случайных чисел значения, зависящие от системного времени, что позволяет воспроизводить случайность возникновения чисел:
array = 0.8 0.25 0.86 0.5 2.2 10 1.2 0.33 0.89 3.5
Для продолжения нажмите любую клавишу...
По завершению работы с массивом, он удаляется, таким образом, высвобождается память, отводимая под его хранение.
|
|
Как создавать и работать с одномерными динамическими массивами мы научились. Теперь рассмотрим фрагмент кода, в котором показано, как объявляется двумерный динамический массив:
// объявление двумерного динамического массива на 10 элементов:
float **ptrarray = new float* [2]; // две строки в массиве
for (int count = 0; count < 2; count++)
ptrarray[count] = new float [5]; // и пять столбцов
/* где ptrarray – массив указателей на выделенный участок памяти под массив вещественных чисел типа float*/
Сначала объявляется указатель второго порядка float **ptrarray, который ссылается на массив указателей float* [2], где размер массива равен двум. После чего в цикле for каждой строке массива, объявленного в строке 2 выделяется память под пять элементов. В результате получается двумерный динамический массив ptrarray[2][5].
Пример. Рассмотрим пример высвобождения памяти, отводимой под двумерный динамический массив:
// высвобождение памяти, отводимой под двумерный динамический массив:
for (int count = 0; count < 2; count++)
delete [] ptrarray[count];
// где 2 – количество строк в массиве
Объявление и удаление двумерного динамического массива выполняется с помощью цикла, как показано выше.
Пример. Разработаем программу, в которой создадим двумерный динамический массив.
// new_delete_array2.cpp: определяет точку входа для консольного приложения.
#include "stdafx.h"
#include <iostream>
#include <ctime>
#include <iomanip>
using namespace std;
int main(int argc, char* argv[])
{
srand(time(0)); // генерация случайных чисел
// динамическое создание двумерного массива вещественных чисел на десять элементов
float **ptrarray = new float* [2]; // две строки в массиве
for (int count = 0; count < 2; count++)
ptrarray[count] = new float [5]; // и пять столбцов
// заполнение массива
for (int count_row = 0; count_row < 2; count_row++)
for (int count_column = 0; count_column < 5; count_column++)
ptrarray[count_row][count_column] = (rand() % 10 + 1) / float((rand() % 10 + 1)); //заполнение массива случайными числами с масштабированием от 1 до 10
// вывод массива
for (int count_row = 0; count_row < 2; count_row++)
{
for (int count_column = 0; count_column < 5; count_column++)
cout << setw(4) <<setprecision(2) << ptrarray[count_row][count_column] << " ";
cout << endl;
}
// удаление двумерного динамического массива
for (int count = 0; count < 2; count++)
delete []ptrarray[count];
system("pause");
return 0;
}
При выводе массива была использована функция setw(), которая отводит место заданного размера под выводимые данные. В нашем случае, под каждый элемент массива по четыре позиции, это позволяет выровнять, по столбцам, числа разной длины:
2.7 10 0.33 3 1.4
6 0.67 0.86 1.2 0.44
Для продолжения нажмите любую клавишу...
Трехмерные массивы:
int x = 5;
int y = 5;
int z = 4;
/* размеры массива */
int ***arr = new int**[x];
for(int i=0;i<x;i++)
{
arr[i]=new int*[y];
for(int j=0;j<y;j++) arr[i][j]=new int[z];
}
Удаление трехмерных массивов производиться так:
for(int i=0;i<x;i++)
{
for(int j=0;j<y;j++)
{
delete[]arr[i][j];
}
delete[]arr[i];
}
delete[]arr;
Четырех-, пяти- а также n-мерные создаются по тому же алгоритму. Для примера покажу четырехмерный:
int x=3,y=3,z=3,t=3;
int ****arr = new int***[x];
for(int i=0;i<x;i++)
{
arr[i] = new int**[y];
for(int j=0;j<y;j++)
{
arr[i][j] = new int*[z];
for(int k=0;k<z;k++)
{
arr[i][j][k] = new int[t];
}
}
}
Мы создавали только массивы типа int. Также само можно создавать и массивы других типов. Ниже приводится динамический массив типа float:
int x = 3;
int y = 7;
float **arr = new float*[x];
for(int i=0;i<x;i++) arr[i]=new float[y];
Удаляется он точно так же.
Тест на тему «Динамические массивы и переменные». Проверь себя!
https://codelessons.ru/cplusplus/dinamicheskie-massivy-i-peremennye-vse-samoe-glavnoe.html
Литература
1. «Уроки C++ с нуля» https://code-live.ru
2. «Язык программирования С++» http://cppstudio.com/post/432/