No hay diferencia. Ambos declaran que "a" es un número entero que no se puede cambiar.
El lugar donde comienzan a aparecer las diferencias es cuando usas punteros.
Ambos:
const int *a
int const *a
declare "a" como un puntero a un número entero que no cambia. Se puede asignar "a", pero no "* a".
int * const a
declara que "a" es un puntero constante a un número entero. Se puede asignar "* a", pero no "a".
const int * const a
declara que "a" es un puntero constante a un entero constante. No se puede asignar "a" ni "* a".
static int one = 1;
int testfunc3 (const int *a)
{
*a = 1; /* Error */
a = &one;
return *a;
}
int testfunc4 (int * const a)
{
*a = 1;
a = &one; /* Error */
return *a;
}
int testfunc5 (const int * const a)
{
*a = 1; /* Error */
a = &one; /* Error */
return *a;
}