Un array bidimensionale non decadono in un puntatore del puntatore agli inte. Decompone in un puntatore agli array di interi, ovvero, solo la prima dimensione decade in un puntatore. Il puntatore non punta ai puntatori int, che all'avanzamento incrementato della dimensione di un puntatore, ma a matrici di 5 numeri interi.
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();
}
Un puntatore a puntatore (int**
) viene utilizzato quando ogni sottoarray viene allocata separatamente (cioè, è in origine un array di puntatori)
int* p[5];
for (int i = 0; i != 5; ++i) {
p[i] = new int[5];
}
Qui abbiamo un array di cinque puntatori, ognuno punta al primo elemento in un blocco di memoria separato, complessivamente 6 blocchi di memoria distinti.
In un array bidimensionale si ottiene un unico blocco contiguo di memoria:
int arr[5][5]; //a single block of 5 * 5 * sizeof(int) bytes
si dovrebbe vedere che il layout di memoria di queste cose sono completamente diversi, e quindi queste cose non possono essere restituiti e superato il stessa strada.
cos'è la griglia? non dovrebbe essere "myarray"? – woodstok
Restituire un riferimento diretto a un membro privato potrebbe non essere sempre una buona idea: in questo modo si interrompe l'incapsulamento, consentendo a chiunque di accedere e modificare il proprio membro privato. Questo può o non può essere accettabile nel tuo progetto. –
@MIkhail: Dal momento che justin non è online da quando ha postato questa domanda, mi sono preso la libertà di sistemarlo. – sbi