Другое

Динамический массив С: определение, как создавать, структуры и удаление

Lorem ipsum dolor

Динамический массив в С это массив, у которого количественное значение ячеек задается переменной, а значит, его размер может изменяться. Такие массивы нужны для того, чтобы более эффективно эксплуатировать оперативную память компьютера в С-программах. Напомним, что в статическом массиве количество ячеек задается числовой константой, а не переменной.

Как это работает? Например, вы написали программку, где получаете какие-то данные от пользователя. Вы объявили массив и задали ему фиксированный размер от 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;

}

 

Этот код создает двумерный массив, потом заполняет его значениями, потом подсчитывает и выводит сумму значений всех массивов. В конце массив удаляется.

Заключение

Динамический массив в С реализуется довольно часто в тех случаях, когда заранее трудно предугадать количество элементов массива или количество памяти для его обработки. Реализация динамического массива не так сложна, и от создания статического массива его отделяет пара собственных «штрихов». Однако функционально динамический массив в Си способен выручить во многих нестандартных ситуациях.

Схожие статьи

Дебатер — это последнее слово искусственного интеллекта или нет?
Другое

Дебатер — это последнее слово искусственного интеллекта или нет?

DigitalOcean хостинг и его аналоги: что это, функции и особенности
Другое

DigitalOcean хостинг и его аналоги: что это, функции и особенности

Карринг [removed] обзор продвинутой техники работы с функциями JS
Другое

Карринг [removed] обзор продвинутой техники работы с функциями JS

Сервис распознавания лиц. Найди любого человека по фотографии!
Другое

Сервис распознавания лиц. Найди любого человека по фотографии!