Работа с динамическими массивами

 

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

Пример.

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/


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



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