Динамический массив в С — это массив, у которого количественное значение ячеек задается переменной, а значит, его размер может изменяться. Такие массивы нужны для того, чтобы более эффективно эксплуатировать оперативную память компьютера в С-программах. Напомним, что в статическом массиве количество ячеек задается числовой константой, а не переменной.
Как это работает? Например, вы написали программку, где получаете какие-то данные от пользователя. Вы объявили массив и задали ему фиксированный размер от 0 до 60 ячеек. Но такая программка не будет функциональной, потому что:
если пользователь заполнит только 10 элементов массива, тогда будет нерациональное использование памяти, потому что памяти будет выделяться под 60 элементов;
если пользователь решит занять 100 элементов массива, тогда у него ничего не получится, так как у нас выделено места только под 60.
Получается, что динамический массив в Си актуален в том случае, когда заранее неизвестно, сколько понадобится ячеек.
Динамический массив в С
В языке программирования С есть две связанные операции, которые применяются при выделении компьютерной памяти для программ:
«new» — отвечает за выделение памяти из области свободной памяти;
«delete» — отвечает за высвобождение выделенной памяти.
Выделяемая память обязательно должна высвобождаться. Поэтому эти операции применяются в паре. Если не делать этого явно, то память все равно освободится при завершении работы программы. Но бывают случаи, когда неиспользование операции «delete» для высвобождения памяти приводит к аварийному завершению работы программы за счет того, что в программе образуется утечка памяти. Поэтому про «delete» лучше не забывать.
При помощи оператора «new» можно выделить память под разные типы данных, например:
int,
float,
double,
char,
и др.
При выделении памяти для динамического массива также принято пользоваться этими операторами. Как происходит создание динамического массива при помощи этих операторов — смотрите чуть ниже.
Динамический массив Си: создание
Создание динамического массива в С происходит по следующему шаблону:
<тип данных> *<имя массива> = new <тип переменной> [<количество элементов>], где
тип данных — может быть разным, однако лучше, чтобы тип данных массива и тип переменной имели одинаковое значение;
тип переменной — указывает, какой тип информации будет располагаться в элементах массива;
количество элементов — здесь задается объем будущего массива: если указать «n», тогда количество элементов будет динамическим, а если указать фиксированное число, тогда количество элементов будет соответствовать числу.
Удаляется динамический массив строчкой:
delete [] <имя массива>
Если задать точное количество элементов, тогда динамический массив будет похож на статический, однако будет отличаться:
способом инициализации;
возможностью вовремя высвободить память.
Динамические массивы могут быть:
одномерными;
двумерными.
Как создать одномерный динамический массив в С
Как выглядит создание одномерного динамического массива в С в коде? Создаем небольшую программку:
int main() {
setlocale(0, "");
int n;
cout << "Определите количество чисел, которое вы будете вводить: ";
cin >> n;
cout << "Нужно ввести " << n << " чисел: ";
int *dynamic_array = new int [n]; // происходит создание динамического массива
for (int i = 0; i < n; i++) {
cin >> dynamic_array[i]; // считываются числа в элементах массива
}
cout << "Выводим числа массива в обратном порядке: ";
for (int i = n - 1 ; i >= 0; i--) {
cout << dynamic_array[i] << " "; // выводятся значения каждой ячейки
}
cout << endl << "Теперь массив удаляется!";
delete [] dynamic_array; // происходит удаление динамического массива
return 0;
}
Результат выполнения программы будет следующий:
Определите количество чисел, которое вы будете вводить: 6
Нужно ввести 6 чисел: 3 5 7 9 17 21
Выводим числа массива в обратном порядке: 21 17 9 7 5 3
Теперь массив удаляется!
Как создать двумерный динамический массив в Си
Двумерный динамический массив в С создается по похожему шаблону, что и одномерный:
<тип данных> **<имя массива> = new <тип переменной>* [<количество элементов>]
Однако нужно отметить, что появился еще один оператор «*» перед именем массива и после типа переменной. Также к созданию такого рода массивов подключается цикличный оператор «for».
Как двумерный массив выглядит в коде:
#include <iostream>
using namespace std;
int main() {
setlocale(0, "");
int **dynamic_array2 = new int* [6]; // создается двумерный динамический массив
for (int i = 0; i < 6; i++) {
dynamic_array2[i] = new int [i + 1];
}
for (int i = 0; i < 6; i++) {
cout << "Необходимо ввести числовые значения" << "(" << i + 1 << ")" << ":";
for (int x = 0; x < i + 1; x++) {
cin >> dynamic_array2[i][x];
}
}
for (int i = 0; i < 6; i++) {
int total = 0;
for (int x = 0; x < i + 1; x++) {
total += dinamic_array2[i][x];
}
cout << "Суммарное значение " << i + 1 << " массивов будет равняться " << total << endl;
}
for (int i = 0; i < 6; i++) {
delete [] dynamic_array2[i]; // удаляется массив
}
system("Пауза");
return 0;
}
Этот код создает двумерный массив, потом заполняет его значениями, потом подсчитывает и выводит сумму значений всех массивов. В конце массив удаляется.
Заключение
Динамический массив в С реализуется довольно часто в тех случаях, когда заранее трудно предугадать количество элементов массива или количество памяти для его обработки. Реализация динамического массива не так сложна, и от создания статического массива его отделяет пара собственных «штрихов». Однако функционально динамический массив в Си способен выручить во многих нестандартных ситуациях.
Другое