Bueno, ciertamente no es bien entendido por la comunidad C como se puede ver al echar un vistazo a SO.La magia es, todos los siguientes son totalmente, 100%, lo que equivale:
void foo(int (*array)[10]);
void foo(int array[][10]);
void foo(int array[10][10]);
void foo(int array[42][10]);
Es muy importante establecer la distinción de un puntero y una matriz. Una matriz no es un puntero. Una matriz puede convertirse en un puntero a su primer elemento. Si usted tiene un puntero que tiene esto:
--------
| ptr | -------> data
--------
Sin embargo, si usted tiene una matriz, que tienen la siguiente:
---------------------------
| c1 | c2 | c3 | ... | cn |
---------------------------
Con el puntero, los datos es en conjunto el otro planeta, pero vinculados a por el puntero. Una matriz tiene los datos en sí. Ahora, una matriz multidimensional es solo una matriz de matrices. Las matrices están anidadas en una matriz principal. Por lo tanto, el sizeof de la matriz es:
(sizeof(int) * 10) * 10
Eso es porque tienes 10 arrays, todos los cuales son conjuntos de 10 enteros. Ahora, si quieres pasar esa matriz, se convierte. Pero a que? Un puntero a su primer elemento. El tipo de elemento es no un puntero, sino una matriz. Como consecuencia, se pasa un puntero a un array de 10 int:
int (*)[10] // a pointer to an int[10]
No es ni un conjunto de int*
, ni un int**
. Puede preguntar por qué la matriz no se pasa como int**
. Es porque el compilador tiene que saber la longitud de la fila. Si realiza un array[1][0]
, el compilador se dirigirá a un lugar sizeof(int) * 10
bytes aparte del comienzo de la matriz bidimensional. Descodifica esa información en el tipo de puntero a matriz.
Por lo tanto, debe elegir entre uno de los prototipos de funciones totalmente equivalentes anteriores. Naturalmente, el último es simplemente confuso. El compilador ignora silenciosamente cualquier número escrito en la dimensión más externa si un parámetro se declara como una matriz. Entonces tampoco usaría la segunda versión anterior. Lo mejor es usar la primera o la segunda versión. Lo que es importante recordar es que C no tiene parámetros (reales) de matriz! El parámetro será un puntero al final (puntero a matriz en este caso).
Observe cómo el caso multidimensional de arriba es similar al caso degenerado de una dimensión a continuación. Todas las 4 versiones siguientes son completamente equivalentes:
void foo(int *array);
void foo(int array[]);
void foo(int array[10]);
void foo(int array[42]);
Aunque la respuesta de Mark Pim se centra completamente en el problema principal de mi pregunta, quiero compensar de alguna manera todo su esfuerzo tratando de explicar los subtelios de matrices como parámetros en C estableciendo esta respuesta como se recomienda. ¡Gracias! – Auron