Una matriz bidimensional no decae a un puntero a puntero a ints. Se desintegra a un puntero a matrices de ints, es decir, solo la primera dimensión se desintegra a un puntero. El puntero no apunta a los punteros int, que cuando se incrementan avanzan por el tamaño de un puntero, sino a las matrices de 5 enteros.
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 puntero a puntero (int**
) se utiliza cuando cada subconjunto se asigna por separado (es decir, que originalmente tiene una matriz de punteros)
int* p[5];
for (int i = 0; i != 5; ++i) {
p[i] = new int[5];
}
Aquí tenemos una serie de cinco puntos, cada uno apuntando al primer elemento en un bloque de memoria separado, en total 6 bloques de memoria distintos.
En una matriz bidimensional que presentamos lo mejor un solo bloque contiguo de memoria:
int arr[5][5]; //a single block of 5 * 5 * sizeof(int) bytes
debería ver que el diseño de memoria de estas cosas son completamente diferentes, y por lo tanto estas cosas no pueden ser devueltos y pasó la mismo camino.
¿Qué es la grilla? ¿No debería ser 'myarray'? – woodstok
Devolver una referencia directa a un miembro privado puede no ser siempre una buena idea: efectivamente se rompe la encapsulación con esto, permitiendo a cualquier persona acceder y modificar su miembro privado. Esto puede o no ser aceptable en su diseño. –
@MIkhail: Como Justin no ha estado en línea desde el momento en que publicó esta pregunta, me tomé la libertad de solucionarlo. – sbi