int doSomething(int n, int arr[n]) Lo que me confunde aquí es la reutilización de la variable n dentro de la lista de parámetros. ¿Alguien puede explicar por qué esto es válido y cuáles son los casos de uso?
C permite varias sintaxis para pasar un puntero de matriz, que incluyen:
int* arr, int arr[] or int arr[10]Sin embargo, TODOS estos son equivalentes al primero, es decir, el compilador solo ve un puntero int y no usa ningún tamaño que se haya especificado en los corchetes de la matriz para imponer la integridad en el tamaño de la matriz pasada. En todos los casos anteriores, el compilador generará:
void __cdecl foo(int * const) La única forma de especificar el tamaño de una matriz es, como lo ha hecho, pasar un parámetro separado que indique el tamaño/longitud de la matriz.
En el ejemplo que cita, el compilador no usa la n en arr[n] para mantener la integridad en los límites de la matriz; en el ejemplo, solo se incluye como una indicación de que el primer parámetro es el tamaño. Una forma menos controvertida del mismo código podría ser simplemente afirmar eso de manera más explícita:
int doSomething(int arr_len, int arr[])En términos de cuál es la mejor convención o preferencia para pasar un puntero y su tamaño de matriz, consulte esta pregunta .
Es válido.
Para este caso específico es equivalente a:
int doSomething(int n, int arr[]); int doSomething(int n, int *arr);porque los parámetros de la matriz se transforman automáticamente en punteros a los elementos de la matriz. En general, existen algunas diferencias entre las declaraciones de parámetros de tipo matriz y de puntero. Ver enlace para más detalles.
En mi opinión, el mejor uso debería ser:
int doSomething(int n, int arr[static n]); Este static n le dice a los compiladores que al menos n punteros de elementos por arr son válidos. Además, hace que la declaración sea visualmente diferente de una declaración de matriz, lo que ayuda a evitar problemas sorprendentes cuando se usa sizeof arr .