Para recibir los arrays únicamente debes poner dos asteriscos y pasar las dimensiones m y n
funcion (int **array, int m, int n);
Si dentro de la función reservas la memoria del array y quieres devolverla hacia afuera, tienes que poner un asterisco más
funcion (int ***array_devuelto, int *m, int *n);
Ten en cuenta, por ejemplo, con un puntero sencillo, pasa lo siguiente
int *a;
funcion (a);
void funcion(int *b)
{
b = new int[10]; // esto no funciona
}
en el momento de llamar a la funcion, a y b apuntan al mismo sitio, pero son punteros distintos. En el momento que haces que b apunte a otro lado, NO lo hace a, con lo cual, desde a, no puedes "ver" la memoria reservada dentro de la función.
Para que ese ejemplo funcione, deberías poner
int *a;
funcion (&a); // pasas la direccion de a
funcion (int **b)
{
*b = new int[10];
}
De esta forma, b es un puntero que apunta al puntero a, y *b es lo mismo que a. Cuando asignas *b, en realidad estas cambiando a y
la memoria la puedes ver desde fuera de la función.
Con arrays de dos dimensiones es lo mismo, pero todo con un asterisco mas.
Para evitar el cacao de asteriscos y dejar el codigo mas claro tienes dos
opciones:
1. declarar un tipo que sea el puntero
typedef int * Puntero_Int;
el array quedaria como
Puntero_Int *Array;
o incluso
typedef int ** Tipo_Matriz;
2. Hacer las matrices con una sola dimension de tamaño MxN (como si alinearas todas las filas en una sola) y