Вообще признаюсь, меня вся эта тема шокирует. Мне просто не приходит в голову такое использовать. Я бы наверное сделал свою реализацию двухмерного масива поверх одномерного.
Тогда следующий вопрос, есть динамический двухмерный массив и статический двухмерный массив, мне надо две реализации функций написать, для динамического, где память выделена фиг знает как, и для статического, где память выделена «непрерывно» ?
Зря бы сделал, в инете есть тесты, по которым «двумерная реализация поверх одномерной» сливает в пух и прах т.к. лишает компилятор возможности оптимизировать
лол. С подмножество С++ => разочаровавшись в С++ (в более мощном множестве), ты разочаровываешься в С (менее мощное множество, содержащее в большем). Это дискретка, против нее не попрешь :)
Кроме обращения к элементу есть другие операции - ресайз на месте, сериализация, удаление колонки, удаление сроки итд.
Результами тестов я несколько удивлен..
Ну смысл в том, что многомерные массивы, хранятся не в виде абстрактного тела (таблица/куб etc) как удобно изображать человеку, а в виде указателей на указатели. Получается такой такой пирог. Тоесть массив любой размерности можно разбить не векторы, которые и хранить в памяти (уже последовательно), и связывать их указателями. Потому, можно утверждать, что по сути многомерных массивов не существует, это все массивы массивов
Хинт: ни один указатель не указывает на много чего-то. Он указывает на начало чего-то. От чего-то можно отсчитывать много еще чего-то. Даже если их много!!
Последние дети получившегося дерева.
Ну есть какой-то вектор указателей из n эл-тов. Каждый этот указатель указывает еще на векторы из k элементов, получается, если эти векторы будут хранить значения, то ячеек будет столько же,сколько способна в себе хранить матрица A[n][k]
у крестопоклонников «передать по значению» — последний спасительный бросок, отделяющий бездны безблагодатности. Такшто можно понимать фразу «передать по значению» не буквально, а как аллюзию на спасительную молитву или другой религиозный ритуал, совершаемый перед закатом солнца вручную.
Ну ты сам это прочитал? Я тебе могу их гору кинуть, там написано что и когда лучше юзать Можешь юзать std::array, но судя по твоим комментам тебе еще рано юзать указатели. так что почитай умные книги, там все это расписано
Что? Он указывает на адрес в памяти, грубо говоря (почитай что-нибудь про организацию памяти. Для затравки ключевые слова: виртуальная память, MMU и т.д.).
Поэтому ты и ходишь по массиву, прибавляя к указателю по 1: *(pointer + offset * 1), т.е. ко второму элементу в массиве интов ты по указателю обратишься по *(pointer + 1), а не *(pointer + sizeof(int)). Потому что (pointer + 1) - это адрес в памяти, на который указывает указатель + еще sizeof(int). То есть, если был адрес 5, то будет 5 + 4 (если инт 4-байтный). Таким образом, один указатель содержит один адрес, но можно, отталкиваясь от этого адреса, пройтись дальше.
А то, что ты описал - это нода простого связного списка. Попробуй, кстати, написать. Поищи на википедии linked list и реализуй. И вообще, поковыряй структуры данных, а то будешь потом такие вопросы задавать.
Допустим A[0][1] указывает на A[0][2], а A[0][2] - на A[0][3], тогда кто будет указывать на значение, хранящееся в A[0][2]? Если они все указывают на соседа, то значения хранятся в последних указателях, и тогда получается, что A[10][10] хранит всего 10 значений.
Если A[0][1] указывает на A[0][2], то тип A[0][1] - указатель на тип, лежащий в А[0][2], но из-за того, что там уже лежит какой-то указатель, то у тебя чем дальше в лес, тем больше дров. Опиши, что ты хочешь сделать вообще.
A[0][1] не указывает на A[0][2] !
Посмотри лекцию. по сути:
A[0] -> A_0[1]. который, уже содержит данные. Вот и получается, что 10 векторов по 10 ячеек с данными 10*10=100
Это несомненно. Хотя, я больше поклонник Страуструпа и Шилдта. Просто в свое время мне тоже тяжело давались указатели, хотя я много чего читал, пока друг мне не объяснил про хранение данных. Это вроде легко, но не очевидно
Звездочки - это указатели. Самая левая Звездочка (с большой буквы) - указатель на указатель (чтоб ты проще запомнил, там рядом 2 звездочки: ** - как мнемоника для сишной формы). Эта Звездочка содержит адрес самой первой звездочки (с маленькой) в столбике. А та, в свою очередь, содержит адрес ячейки, в которой хранится первый «0». Отшагнув от адреса в нашей звездочке на размер, необходимый, чтобы вместить «0», мы получим адрес, по которому хранится «1». А чтобы получить адрес второй звездочки с маленькой буквы, нужно от адреса в Звездочке отшагнуть столько, сколько нужно для хранения адреса первой звездочки с маленькой буквы. Таким образом, можно рассматривать маленькие звездочки не как указатели, а как массивы [0,1,2,3,4]. А Звездочка - не указатель на указатель, а массив указателей (по аналогии). То есть ты можешь для удобства представлять, что она указывает на [*,*,*,*].