ну, насколько я помню, в C ++ (и я думаю, что C, хотя это не моя сильная сторона), 2D-массив, объявленный как Values[][]
, обычно (не знаю, если всегда) реализован как массив C- массивы стилей. однако, когда вы объявляете их в стеке (например, в локальной переменной), я считаю, что форматирование памяти отличается.
так, когда вы объявляете локальную переменную, все раскладывается , как если бы это был просто 1d массив, и вы получаете такие вещи, которые вы можете фактически привести к указателю, а затем получить доступ как 1D массив. (!) Однако, он по-прежнему распознается так же, как обычный 2D-массив в пределах области объявления, и, возможно, если вы передадите параметр, который объявлен с нотацией []
.
но если вы выделите одну из них в куче (например, глобальную или статическую или через новую), история будет другой. теперь память распределяется как фактический массив массивов, и поэтому фактические результаты областей памяти, которые вы индексируете, если вы преобразуете в одномерный массив и индекс, теперь вместо этого будут указателями.
Я подтвердил свой отзыв, выполнив следующее: я создал int HeapArray[3][3];
как глобальный и int StackArray[3][3];
как локальный (оба с инициализаторами { { 10, 20, 30 }, {40, 50, 60}, {70, 80, 90 } }
). внутри своей функции я приводил их обоих к указателю типа int, int* ptrHeapArray = (int*)HeapArray;
и int* ptrStackArray = (int*)StackArray;
, а затем просматривал возвращаемое значение 0-го элемента каждого.
[править: упс, я их перевернул; исправлено сейчас]
ptrStackArray[0]
было равно 10
ptrHeapArray[0]
был равен указателю на int [3];
так что я думаю, что мой ограниченный отзыв точен. :) надеюсь, это поможет!