Всех приветствую! Вопрос ради теоретического интереса. Допустим есть двухмерный массив указателей на строки: Код (C): char *langs[][2] = { {"C++", "C"}, {"javascript", "python"}, {"html", "css"}, {NULL, NULL} }; Как мне получить второй элемент вложенного массива с помощью арифметики над указателями не прибегая к оператору квадратных скобок?
rmn, вариант. Ещё у можно с помощью двухмерной непрямой адресации обращаться к первому элементу вложенного массива. Код (C++): char *res = **langs Или чтобы получить первый символ вложенного массива первого элемента. Код (C++): char res = ***langs
А кто-нибудь что-нибудь знает о том, обязан ли компиллер хранить многомерные массивы непрерывным куском памяти без паддингов?
_DEN_, Да, элементы массива будут непрерывным куском и к ним можно обращаться по одномерному индексу [ z*depth + y*width + x ]. Если, конечно, добрый дядя, пишущий модный молодежный фреймворк, не перегрузит глобально операторы, чтобы логика их работы не была похожа на мерзкую сишечку
То, что они "будут" - это понятно. Речь не о практической стороне, а о стандарте. Смысл в том, чтобы не словить неприятный сюрприз, когда код будет скомпилен на какой-то новой (возможно экзотической) платформе.
_DEN_, Стандарт не читал, но верую, что N-мерные массивы там определяются как одномерные, линейные и непрерывные (вся эта мерность существует только во время компиляции).
Обязан. По стандарту, sizeof массива должен быть равен произведению размера массива на sizeof элементов. Так что, места для дополнительных паддингов (кроме тех, которые есть в элементах) не остаётся.
Компилятор может сделать все что хочет, например распределить массив на регистры. Главное, чтобы наблюдаемое поведение не изменилось. Т.е., если вопрос в том, можно ли к нему обращаться как к одномерному, то да, можно.
зависит от компиля, но дажЬ ежель зараза тип ЫнЪТЭЛЭКЪТЪ являет тебе, то имеется обходной вариант.. https://gcc.godbolt.org/
однако, пахать должно практически везде вообще-то не каждый компиль поддерживает многомерные массивы, тч сий способ наиболее действенный для общего случая.
исходя из логики "безопасного" кода, действительно акь-БЭ актуально разделять одномерные и многомерные массивы. Однако, из сией же логики нужно полностью запрещать "сырые" указатели
А как описать указатель на реальную память на адрес 0x0b800. Вот так правильно будет ? char far *vidmem = (char far *) 0x0B800 А теперь дать смещение 10 и записать в ячейку памяти на которую указывает указатель 67h ... Пробовал вот так vidmem[10]=67h, не работает .... Компилируется без ошибок но не работает (((