¿Por qué `void func(int A[const 10])` hace que el parámetro de la matriz sea constante y no los elementos de la matriz?

Hoy encuentro el siguiente fragmento de código.

void func(int A[const 10]) { ... }

Al compilarlo usando gcc, concluyo que int A[const]es equivalente a int* const Aen lugar de const int *A. Me pregunto por qué aquí: constestá entre paréntesis, ¿por qué no modifica elementos de AAmismo?

Answer

I wonder why

Porque el estándar C lo dice explícitamente.

6.7.6.3 ¶ 7 La declaración de un parámetro como "matriz de tipo" se ajustará a "puntero calificado a tipo", donde los calificadores de tipo (si los hay) son los especificados entre [ y ] de la derivación del tipo de matriz.

Tenga en cuenta, "puntero calificado a tipo", no "puntero a tipo calificado". Este último es expresable con la sintaxis ordinaria const int A[10].

Esta sintaxis se inventó específicamente para expresar "un puntero calificado al tipo, ajustado a partir de un tipo de matriz con un tamaño opcional proporcionado para la documentación". Sólo es válido en prototipos de funciones.

Meaning of "void func(int a[const 10])"

Es exactamente lo mismo que void func(int *const a). 10se ignora y no tiene significado; en este contexto, es solo documentación .

int *const aes un constpuntero a elementos mutables.

Ver Puntero constante vs Puntero a constante , ¿Cuál es la diferencia entre const int*, const int * const e int const *? , ¿Por qué una matriz C decae a un puntero cuando se pasa con tamaño .