Функции в C++ для начинающих Передача в функцию двумерного динамического массива

Сайт не является учебником по программированию. Это только небольшой авторский сборник информации в помощь начинающим программистам.

Иногда возникает вопрос по работе массивов и функций. Многие испытывают проблемы при создании двумерного динамического массива для последующей его обработки с помощью функций. Найти информацию решения таких задач на момент написания статьи не так уж и просто. Да, описаны варианты создания, но лично я находил или простое создание двумерного динамического массива внутри main() или выделение памяти для массива непосредственно внутри принимающей его функции. Мне это очень не нравилось

Код С++ Создание динамического двумерного массива и обработка его с помощью функций

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

Для того чтобы создать двумерный динамический массив, был использован указатель на указатель. Для решения обычных задач необязательно вникать в суть указателя и достаточно посмотреть, как указатели тут используются. Вообще что такое указатели, зачем они нужны, их недостатки и их преимущества любой уважающий себя программист наверняка знает, а, значит, если решили научиться программировать, то тоже должны изучить.

При написании приведенной программы, ячейки для двумерного массива были динамически созданы внутри функции main() Сразу же был дописан код очистки памяти от создаваемого массива. Если написать не сразу, то потом легко запутаться или забыть. Очистка памяти нужна только и только тогда когда массив больше не нужен. Между кусками кода выделения памяти под двумерный массив и очистки от него памяти был написан вызов двух функций. Первая функция принимает двумерный массив в качестве аргумента.
Благодаря тому, что принимаемый параметр является указателем, то любые изменения массива внутри функции, влияют на этот массив вне функции напрямую (Передали на обработку -> Получили обновленный). Нужно заполнить массив значениями.
Чтобы заполнить массив значениями, нужно знать его размерность.
Чтобы функция занесения данных в двумерный динамический массив знала размерность, туда были переданы эти данные. Осталось только использовать ввод данных с помощью циклов. Не думаю, что по этим циклам должны возникнуть вопросы. Функция маленькая и удобочитаемая. Главное понимать, что
Передавая двумерный массив, в функции можно принять указатель на указатель массива и указать число строк и колонок внутри массива.

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

В качестве эксперимента была попытка реализовать создание динамического двумерного массива внутри цикла, потом передать этот массив в функции. Этот момент комментирован, но может оказаться кому-то полезным.

Главное четко осознавать

  • если выделили память, то обязательно нужно её удалять
  • Удалять память нужно только и только тогда, когда динамически созданный массив больше реально не нужен
  • Для передачи двумерного динамического массива в функцию удобно использовать указатель на указатель и при передаче его в функцию, в функцию стоит передавать размерность массива

=========================================
Вот тоже по теме, но только для одномерного динамического массива. С помощью отдельных функций выделить память массиву, записать в динамический массив значения, вывести динамический массив на экран и удалить выделенную память динамического массива (код из Visual Studio)

По поводу освобождения памяти не знаю корректно или нет, в остальном работает. Возможно кто-то сможет выцепить интересное для себя. Смысл прост — каждая функция в одну строчку.

Все комментарии на сайте проверяются, поэтому ваш комментарий может появиться не сразу. Для вставки кода в комментарий используйте теги: [php]ВАШ_КОД[/php]

13 комментариев: Функции в C++ для начинающих Передача в функцию двумерного динамического массива

  • Alexsandr говорит:

    Объясните пожалуйста следующую строку :
    int **A; //Для создания двумерного массива удобен указатель на указатель

    Во многих примерах встречаются «указатель на указатель», опишите подробнее их отличие от одного указателя и суть этой записи.

    • admin говорит:

      Конкретно в этом примере объясняю. А вообще суть использования от примера зависит. Было бы все с указателями просто, не советовали бы их избегать.

      Если делать одномерный массив из неизвестного заранее количества элементов, то в C++ НЕ получится НЕ использовать указатели. Возможно вы уже знакомы с созданием такого одномерного массива. Для создания одномерных массивов достаточно одного указателя.

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

      Первый используемый указатель используется чтобы выделить память под начало каждой строки, второй указатель — это массив, который содержится в этой строке.
      Точнее говоря первый массив — только указатели на начало строк.
      =============================
      примечание. Колонка или строка это будет — принципиального значения не имеет. Также чтобы не мешать все в кашу, там и выделение, и чтение элементов и модификация элементов.

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

  • Alexsandr говорит:

    Спасибо, этой информации более чем достаточно.

  • Аноним говорит:

    :mrgreen: :mrgreen: :mrgreen:

  • Akjol говорит:

    А как в функцию ввести двухмерный не динамический массив, а обычный обьявленный как а100 на 100 ?

    • admin говорит:

      Так можно

  • Vera говорит:

    А как инициализировать двумерный динамический массив определенными числами?

    • admin говорит:

      Наверное никак. Вот я спрашивал, но ответа не получил тогда
      http://www.cyberforum.ru/cpp-beginners/thread731832-page2.html
      _____________________________________________
      Когда объявлется динамчески создаваемый массив, то неизвестны адреса памяти, в которых элементы такого массива будут расположены, а вот как положить что-то в неизвестно куда?
      Элементы динамического массива располагается в некоторого рода хаотичном порядке. Поэтому сначала он просто создается, а потом в него уже присваиваются элементы. Любые хитровыводимые приемы не более чем создание просто вида инициализации.

  • Иван говорит:

    Спасибо большое за такое подробное объяснение. Сам я учусь пока что на С программировать, но тут все так понятно, что я смог сделать тоже самое и при этом все понял 🙂 Долго не мог понять, как вывести динамический массив через функцию, то параметры не так указывал, то массив в самой функции вводил. Все решил, спасибо автор!

  • Аноним говорит:

    Что за клоун выбирал такую расцветку для кода?

  • Аноним говорит:

    Расцветка — супер

  • Аноним говорит:

    Зачем передавать при удалении количество ел-ов если вы в этом примере не использовали это?

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

Ваш e-mail не будет опубликован.

Поиск

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

НАГРАДИ АВТОРА САЙТА
WEBMONEY
R375024497470
U251140483387
Z301246203264
E149319127674

Приходит программер в магазин. Подходит к витрине, хочет достать еды, но не может и говорит: - Rеаd оnlу, однако...

Выражаю свою признательность

  • Максиму очень признателен за указание на мои ошибки и неточности.
  • Sergio ===> за оказание помощи в исправлении моих ошибок
  • Gen ===> за правильное стремление помочь другим новичкам и выявления моих ошибок