Ты вообще в курсе что в С нет возможности передать многомерный массив в функцию, и только с помощью такого вот трюка и можно его обрабатывать. Никакого UB тут нет
Что хорошо то?
арифметика указателей не разрешает «ходить» по частям многомерного массива если очень хочется, то можно считать, что оно работает так же, как работало создание объектов через malloc до 20 стандарта, но не более того
> арифметика указателей не разрешает «ходить» по частям многомерного массива c чего бы?
https://t.me/ProCxx/434644
Кстати, я не уверен, что не разрешает. Мне кажется, данный пункт несколько проясняет: http://eel.is/c++draft/dcl.array#9
Тут ничего нет про представление многомерного через одномерный, да и это ненормативная note Просто прояснение того, как нормальный доступ к многомерному массиву проходит
Разрешает. Без этого вообще бы ничего не работало
Пока что основное утверждение, что не разрешает. И это сложно оспорить :)
1) прямо там же в примере написано, что многомерный массив это массив массивов. держим это в уме 2) обращаемся к пункту дня expr.add#4.2: if P points to an array element i of an array object x with n element. соответственно, когда мы берем указатель P на элемент i многомерного массива x, то n будет какая-то из размерностей исходного многомерного массива (последняя), но никак не N*M и так далее
Да с чего? Они там приводят пункт что нельзя указателю бегать за пределы массива, ну так оно и не бегает...
Otherwise, the behavior is undefined.
Да, я сейчас так смотрю, судя по всему, результирующее выражение должно указывать именно на одну из этих размерностей. Сейчас пытаюсь собрать все пункты стандарта, указывающие на это :)
Ну так ты не выходишь за пределы этого объекта. Массив массивов , ОДИН массив
именно что не один массив, а массив массивов
Алло, Массив один. Это один объект, со всех точек зрения.
Массив в стандарте C++ определен только одномерный
А у меня наверное альтернативный стандарт, Я ж забыл...
массив массивов это иерархия подобъектов то есть int[N][M] это не просто сахар над int[N*M]
Но массив - тоже легальный тип элемента массива. И в C и в С++ многомерные массивы это массивы массивов.
что конкретно тебе дает такое рассмотрение массивов??
как раз Note 3 и говорит о том, как трактуется "многомерный массив" declares an array of three elements, each of which is an array of five elements, each of which is an array of seven integers.
https://t.me/ProCxx/434705
я дважды перечитал и не понял. не заставляй перечитывать в третий раз
Это лишь жонглирование словами. Тебе объясняют так или иначе.
Собственно вот, смотрим в такой последовательности: http://eel.is/c++draft/dcl.array#1 Число N – это array bound, количество элементов типа Т http://eel.is/c++draft/dcl.array#6 https://eel.is/c++draft/expr.add#4.2 И в данном случае написано n elements, со ссылкой на весь раздел выше. В приведённых же мной ссылках чётко указано, что является этим N. То есть у нас есть N элементов типа Т, где Т, например, тоже массив известного размера в таком случае, выражения вида "указатель на элемент массива" + какое-то число указывает на какой-то из подмассивов. Если мы вышли за границы это массива массивов, то есть за число N этих подмассивов, то у нас UB. Всё, ходить под двумерному массиву как одномерному нельзя
Я ещё раз говорю, в С и С++ правила определения арифметики указателей одинаковы. В С нет другого способа передать массив в функцию кроме pointer decay. Многомерный он или нет - все равно. Так что все что вы там вычитали - чушь.
decay убирает лишь одну размерность http://eel.is/c++draft/conv.array#1
То есть то, что прямо написано в стандарте, – чушь? С и С++ разные языки, в конце концов. То, что С++ в определённой степени совместим с С, это факт, да. Но никто не обещал, что один и тот же код на С и С++ будет работать одинаково и будет одинаково валидным. Скорее наоборот
То что вы проинтерпретировали - чушь, а не стандарт
нет, если мы передаем [4][4] то это повод для оптимизации, и если эта оптимизация поломает логику, то се ля ви
https://godbolt.org/z/xTYean смотри в ошибки
Какой оптимизации?
векторной, например
Илья, @Endill намного более компетентен в этих вопросах, зачем же спорить? Ты всё-таки админ, к тебе люди прислушиваются.
Там вообще не это сказано - там говорится, что если привести массив к указателю, то это будет указатель на его первый элемент и все.
Да это ни при чем тут
конечно я лишь выбрал более простую и короткую формулировку
Обсуждают сегодня