Ein zweidimensionales Array zerfällt nicht in einen Zeiger auf einen Zeiger auf Ints. Es zerfällt zu einem Zeiger auf Arrays von Ints - das heißt, nur die erste Dimension zerfällt zu einem Zeiger. Der Zeiger zeigt nicht auf int-Zeiger, die, wenn sie inkrementiert werden, um die Größe eines Zeigers vorrücken, sondern auf Felder mit 5 ganzen Zahlen.
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();
}
Ein Zeiger auf Zeiger (int**
) verwendet wird, wenn jeder Sub-Array separat zugeordnet ist (das heißt, ursprünglich ein Array von Zeigern hat)
int* p[5];
for (int i = 0; i != 5; ++i) {
p[i] = new int[5];
}
Hier haben wir eine Reihe von fünf Zeigern, jeder zeigt auf das erste Element in einem separaten Speicherblock, insgesamt 6 verschiedene Speicherblöcke.
In einem zweidimensionalen Array erhalten Sie einen einzigen zusammenhängenden Speicherblock:
int arr[5][5]; //a single block of 5 * 5 * sizeof(int) bytes
Sie sollten das Speicherlayout dieser Dinge sehen, dass ganz unterschiedlich sind, und daher können diese Dinge nicht zurückgegeben werden und übergeben die gleicher Weg.
Was ist Raster? sollte es nicht "Myarray" sein? – woodstok
Die Rückgabe eines direkten Verweises auf ein privates Mitglied ist möglicherweise nicht immer eine gute Idee - Sie brechen damit effektiv die Kapselung, sodass jeder auf Ihr privates Mitglied zugreifen und dieses ändern kann. Dies kann in Ihrem Design akzeptabel sein oder auch nicht. –
@MKchail: Da Justin seit seiner Veröffentlichung dieser Frage nicht online war, habe ich mir die Freiheit genommen, es zu reparieren. – sbi