У меня вопрос о том, как C/С++ внутренне хранит многомерные массивы, объявленные с использованием обозначения foo[m][n]
. Я не ставил под сомнение чистые указатели на указатели и т.д.... Я спрашиваю из-за скоростных причин...
Исправьте меня, если я ошибаюсь, но синтаксически foo
- это массив указателей, которые сами указывают на массив
int foo[5][4]
*(foo + i) // returns a memory address
*( *(foo + i) + j) // returns an int
Я слышал из многих мест, что компилятор C/С++ преобразует foo[m][n]
в одномерный массив за кулисами (вычисляя требуемый индекс измерения с помощью i * width + j
). Однако, если это верно, то следующее:
*(foo + 1) // should return element foo[0][1]
Таким образом, мой вопрос:
Верно ли, что foo[m][n]
(всегда?) Хранится в памяти как плоский одномерный массив? Если да, то почему приведенный выше код работает, как показано.