Найти в Дзене
Айти Поц

Магия указателей в C++

Результат
Результат

Сёркис, в этом посте рассмотрим инициализацию и вывод элементов на примере двумерного, трехмерного, да хоть какого-мерного массива в одном цикле. В этом нам поможет знание устройства памяти и указатели.

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

Теперь реализуем это, обрати внимание на скрин, `fillArray(double*, int)` - принимает указатель на нулевой элемент и его размер, мы используем один цикл чтобы пробежать все элементы. Аналогично устроены функции `printArray()` и `sort()`, где `k` - сколько элементов выводить в строке.

Конечно не все так гладко, это работает только со статическими массивами, с динамическими это не прокатит, там элементы в памяти располагаются как то иначе, потому что программа просто кидает ексепшн с нарушением доступа чтения по индексу. Если кто знает решение для динамических массивов пишите в чат или я попробую на выходных подумать над этой задачей :)

Кстати, этот финт с указателями используют в геймдеве, Я СВОИМИ ГЛАЗАМИ ВИДЕЛ!!!

Больше таких постов у меня в Telegram