Двумерный массив не распадается на указатель на указатель на int. Он распадается на указатель на массивы ints - то есть только первое измерение распадается на указатель. Указатель не указывает на указатели на 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
Вы должны увидеть, что расположение памяти этих вещей совершенно разные, и, следовательно, эти вещи не могут быть возвращены и прошло так же.
Что такое сетка? разве это не «майаррей»? – woodstok
Возвращение прямой ссылки на частного участника может не всегда быть хорошей идеей - вы эффективно нарушаете инкапсуляцию этим, позволяя кому-либо получить доступ и изменить вашего частного участника. Это может быть или не быть приемлемым в вашем дизайне. –
@MIkhail: Поскольку justin не был онлайн с того момента, как он опубликовал этот вопрос, я взял на себя смелость исправить это. – sbi