С++ для начинающих. Выделение памяти для трехмерного массива. Многомерные массивы.

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

Создание многомерных массивов в С++. Иногда хочется создать что-то такое никому ненужное типа многомерных массивов. Ответы на вопрос создания многомерных массивов есть в просторах интернета, но трехмерные, четырехмерные и т.д. выступают в качестве притесняемого меньшинства. На самом деле трехмерные и более мерные массивы не так уж и нужны. Они не очень удобны и сами по себе массивы имеют некоторые ограничения, свойственные массивам.

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

Итак, чтобы динамически выделять память под массивы, нужно использовать указатели. Если Вы приноровились создавать двумерные и одномерные массивы, используя выделение памяти, то должны были обратить внимание на использование *. В одномерном массиве одна звездочка, в двумерном две, следовательно в трехмерном три и так далее.

Что такое ***Arr? Это указатель Arr, который указывает на такой указатель (Arr~), который тоже указывает на указатель (Arr~~) и только этот последний указатель Arr(~~) указывает на адрес памяти с конкретным значением.
Arr указывает на Arr~, Arr~ указывает на Arr~~
На самом деле каждый указатель указывает на адрес памяти, просто по адресам лежат указатели и фактически получаются такие «перескоки» (если, конечно, не обращаться к адресам как к таковым).
Я сейчас использовал символ ~ только чтобы было немного понятнее какие указатели я имею ввиду. Такую символику вообще использовать не стоит. Она исключительно только для этой статьи.
____________________________

Кроме того, что сейчас было сказано имеет смысл вспомнить (ну или узнать), что указатель фактически может представлять собой начало одномерного массива. Следовательно в трехмерном массиве такая матрешка.

  • Указатель на начало трехмерного массива указывает на массив массивов.

Если с массивами работать не умеем, то ничего и не поймем. Если умеем, скорее всего я распинаюсь зря.

Итак, сильно загромождать не буду. Вот код выделения памяти (НО нужно еще высвобождать)

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

Вот исходный код выделения и высвобождения памяти для трехмерного массива

Осталось только понять что вообще с ним можно делать и как с ним работать. Так как это массив, содержащий массив массивов, то и работать с ним можно соответственно.

Ну что ж. Я всего показать все равно не могу, но покажу пример как можно класть массив в массив сразу. Я же сказал, что трехмерный массив — это массив, содержащий массив массивов, вот и будем массив класть в массив.

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

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

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

2 комментария: С++ для начинающих. Выделение памяти для трехмерного массива. Многомерные массивы.

  • Константин говорит:

    Я в книге нашел два способа выделения памяти для динамических массивов и использовал вот этот int (*a)[6][5]= new int [3][6][5];

    Правда там был пример для двухмерного дин. массива, но методом тыка я переделал под трехмерный.

    Так вот по условию задачи мне нужно увеличить индексация начального элемента на 1 (из [0][0][0] сделать [1][1][1]).
    Для одномерного массива я писал бы а+=1, но тут эта строка меняет лишь номер матрицы (из [0][0][0] делает [1][0][0]).
    Кто знаком с такой конструкцией и принято ли ею пользоваться ?

    • admin говорит:

      Это указатель на начало массива двумерных массивов [6][5], т.е. это как массив из массивов [6][5].(только оно не массив, а указатель на набор массивов [6][5]. Это важно).
      int (*a)[6][5] = new int[3] -> здесь а становится массивом с тремя значениями, каждое из которых массив фиксированного размера [6][5].
      a[0] — массив[6][5], a[1] — массив[6][5], a[2] — массив [6][5]

      Вот пример кода.

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

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

Поиск

 
     

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

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

У программиста есть два состояния: "Втупляю" и "Попёрло". (C) Gen

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

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