Вы не можете конвертировать массивы в "указатели на указатели ... в указатели", потому что они разыменовываются по-разному; попытка использовать многомерный массив в качестве «указателя на ... указатель» на что-либо приведет к неопределенному поведению так же, как разыменование недопустимого указателя.
В памяти «указатель на указатель ...» на объект представлен
a -> b -> c -> ... -> object
Где a
, b
, c
, ...
и object
находятся в совершенно разных частях памяти. Чтобы проиндексировать указатель, указатель разыменовывается.
Однако массивы хранятся в непрерывной памяти. Например, int a[2][2]
будет
[0,0][0,1][1,0][1,1]
Индексирование многомерного массива не разыменовывает указатель, оно меняет арифметику, которая используется для вычисления смещения от начала массива, в котором находится желаемое значение. Формула будет
адрес массива + index 1 * sizeof (первое измерение) + index 2 * sizeof (второе измерение) + ... + index n * sizeof (объект)
Где sizeof(nth dimension)
- это размер всех вложенных измерений. Например, с int a[3][2]
, который представлен
[0,0][0,1][1,0][1,1][2,0][2,1]
, индекс a[2][1]
будет
адрес a
+ 2 * (sizeof (int) * 2) + 1 * sizeof (int)
Который в C ++ будет (char*)a + 16 + 4
, последним элементом массива.
Чтобы решить эту проблему, вам нужно использовать только указатели. Вы не должны (и не можете) хранить многомерные массивы вместе с указателями в одном массиве.
<ч />
Мне трудно выразить все это словами; если я не имею смысла, скажите, пожалуйста.