Двумерный массив не распадается на указатель на указатель на целые.Он распадается на указатель на массивы целых чисел, то есть только первое измерение распадается на указатель.Указатель указывает не на указатели типа int, которые при увеличении увеличиваются на размер указателя, а на массивы из 5 целых чисел.
class Myclass {
private:
int myarray[5][5];
public:
typedef int (*pointer_to_arrays)[5]; //typedefs can make things more readable with such awkward types
pointer_to_arrays get_array() {return myarray;}
};
int main()
{
Myclass o;
int (*a)[5] = o.get_array();
//or
Myclass::pointer_to_arrays b = o.get_array();
}
Указатель на указатель (int**
) используется при каждом подмассивевыделяется отдельно (то есть у вас изначально есть массив указателей)
int* p[5];
for (int i = 0; i != 5; ++i) {
p[i] = new int[5];
}
Здесь у нас есть массив из пяти указателей, каждый из которых указывает на первый элемент в отдельном блоке памяти, всего 6 отдельных блоков памяти.
В двумерном массиве вы получаете один непрерывный блок памяти:
int arr[5][5]; //a single block of 5 * 5 * sizeof(int) bytes
Вы должны увидеть, что расположение этих вещей в памяти совершенно другое, и поэтому эти вещи не могутбыть возвращены и переданы таким же образом.