Esto es una especie de asimetría en la sintaxis C. En C no es posible pasar una matriz a una función, de modo que cuando se usa la sintaxis de la matriz en una declaración de función para uno de los parámetros, el compilador la lee como un puntero.
En C, en la mayoría de los casos, cuando utiliza una matriz en una expresión, la matriz se convierte implícitamente en un puntero a su primer elemento y eso es exactamente lo que ocurre cuando se llama a una función. En el siguiente código:
int bar[] = {1,2,3,4};
foo(bar);
la matriz se convierte en un puntero al primer elemento y que es lo que recibe la función.
Esta regla de conversión implícita no siempre se aplica. Como descubrió, por ejemplo, el operador sizeof
trabaja en la matriz, e incluso el operador &
(dirección de) trabaja en la matriz original (es decir, sizeof(*&bar) == 4*sizeof(int)
).
Una función en C no puede recibir una matriz como parámetro, solo puede recibir un puntero al primer elemento o un puntero a una matriz ... o debe envolver la matriz en una estructura.
Incluso si se pone un número entre los paréntesis de la declaración de la función ...
void foo(int x[4])
{
...
}
ese número es completamente ignorado por el compilador ... que la declaración para el compilador es totalmente equivalente a
void foo(int *x)
{
...
}
y, por ejemplo, incluso llamándolo el paso de una matriz con un tamaño diferente, no dará lugar a ningún error ...
int tooshort[] = {1,2,3};
foo(tooshort); /* Legal, even if probably wrong */
(en realidad un compilador PUEDE dar una advertencia, pero el código es C perfectamente legal y debe ser aceptada si el compilador sigue el estándar)
Si usted piensa que esta regla acerca de las matrices, cuando en argumentos de la función es extraña entonces estoy de acuerdo, pero así es como se define el lenguaje C.
El compilador no ignora el número, int x [4] como parámetro de función significa que debe pasar un puntero de matriz de _exactly_ 4 elementos. Es lo mismo que escribir 'int (* x) [4]' en otro lugar del código. Aparte de eso, esta respuesta señala el problema: la sintaxis de matriz para los parámetros tiene un significado diferente para las matrices declaradas en otras partes del programa. Es una de las "características" más tontas del lenguaje C. Para evitar confusiones, use siempre la notación 'int * x' para los parámetros. – Lundin
¿Puede indicar dónde está escrito en el estándar que el número entre paréntesis debe ser igual al tamaño de la matriz pasada? Sugerencia: este sería un requerimiento extraño dado que no se puede pasar una matriz y que la función en realidad solo recibe un puntero. Cuando se llama a una función con 'foo (bar)' donde 'bar' es una matriz, esa matriz ya se ha convertido en un puntero ** incluso para el compilador ** antes de considerar la llamada a la función. No tendría sentido imponer una limitación a la información de tamaño que ya se ha descartado en la conversión. – 6502
@Lundin, no para la primera dimensión de los parámetros de matriz, el 4 es esencialmente ignorado. C99 tiene la posibilidad de la palabra clave 'static' además, allí, para especificar que la función espera * al menos * para los elementos. Pero aún así, el tipo del parámetro es 'int *'. –