Двумерный динамически создаваемый массив. Инициализация и удаление с помощью функций

Эта статья об инициализации и очистке двумерных динамически-создаваемых массивов с помощью функций. Читателям, ознакомившимся со статьёй Функции в C++ для начинающих. Передача в функцию двумерного динамически-создаваемого массива, текущая статья нового почти ничего не даст. Эта статья написана для тех, кто целенаправленно ищет способ передачи динамически-создаваемого массива в функции. Тем не менее эта статья может оказаться полезной и достаточно информативной, поэтому рекомендуется автором сайта к прочтению новичками.
Некоторых начинающих программистов мучает вопрос взаимодействия многомерных динамически-создаваемых массивов и функций. Особенно остро это проявляется при ручном управлении памятью. Я продемонстрирую простой пример работы с двумерным динамически-создаваемым массивом, в котором каждая функция занимается отдельной задачей:

  1. Выделение памяти
  2. Очистка памяти
  3. Заполнение массива значениями
  4. Вывод значений массива на экран

Если вы любите читать, то должны были успеть узнать, что каждая функция должна выполнять одну задачу, потому что так проще выявлять ошибки или переделывать часть программы. Спихивание в одну функцию обязанностей по выделению памяти и освобождению памяти — это уже две задачи, их удобнее разделить.
Работать с функциями по выделению памяти можно двумя способами: использовать в параметрах параметр ссылочного характера (ссылку на двойной указатель) или использовать умение функций отдавать операцией return значения в качестве готового плода функции.
Первый случай:

Когда вы видите, что у Вас получилось повторение, подобное случившемуся в показанном коде повторению к обращениям нескольких функций, это всё можно вынести в собственную функцию:

Если в результате работы программы массив будет выглядеть странно, то у вас в окно просто не помещается количество колонок.
Второй способ — способ с использованием return. Функции чаще используют для подбора из них вычисленного значения. В таком случае можно будет не использовать параметр ссылочного характера при выделении памяти, но нужно будет следить за присваиваниями в указатель вычисления функции:

Этот показанный способ немного сложнее, и конечно он не панацея. Вам может потребоваться слегка отличающийся подход. В показанном случае заранее известно, что используется один массив, поэтому при выделении памяти дописана: проверка выделялась ли для arr память ранее — и если выделялась, происходит вызов функции очистки массива и только потом память выделяется вновь, чтобы у нас была возможность работать с иным двумерным массивом. Функция по очистке памяти была перенесена чуть наверх, чтобы её можно было вызвать из функции выделения памяти. Этого можно было бы избежать, если использовать прототипы функций, но я показываю без прототипирования, поэтому просто перенёс функцию выше точки вызова. А внутри функции очистки нужно обязательно обозначать нулевым указателем, что адрес почищен, этот нулевой указатель даст возможность проверки, которая поможет при выделении памяти определиться: нужна чистить указатель или нет.
Если кому-то сложно понять, зачем всё-таки в выделении памяти чистить что-то, то просто подумайте: мы используем одну указательную переменную, в одну указательную переменную нельзя одновременно записать два адреса. Если не уничтожим один массив, который уже был востребован указательной переменной и больше не нужен, то такой ненужный массив просто останется висеть в памяти после присвоения в указательную переменную адрес новой области, а доступ к висюке потеряется. Поэтому память, используемая для востребованного указательной переменной массива, предварительно очищается, после чего нового массива формируется новый участок памяти, который отдаётся как плод работы функции. Указательная переменная, указывающая на устаревший массив, подбирает адрес актуального массива. Вот и всё.

Один комментарий на «“Двумерный динамически создаваемый массив. Инициализация и удаление с помощью функций”»

  1. Максим:

    в fillarr, showarr передавать Arr по ссылке нет никакой необходимости.
    сейчас нет такой необходимости и в delarr, но лучше было бы если бы он передавался всё-таки по ссылке и в конце очистки добавить Arr=NULL;

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Поиск

 
     

Случайная книга в электронном формате

https://www.litres.ru/vladimir-dronov/html-5-css-3-i-web-2-0-razrabotka-sovremennyh-web-saytov-2/?lfrom=15589587

Последние комментарии

Яндекс.Метрика