Não há diferença. Ambos declaram que "a" é um número inteiro que não pode ser alterado.
O lugar onde as diferenças começam a aparecer é quando você usa ponteiros.
Ambos estes:
const int *a
int const *a
declare "a" como um ponteiro para um inteiro que não muda. "a" pode ser atribuído, mas "* a" não.
int * const a
declara "a" como um ponteiro constante para um inteiro. "* a" pode ser atribuído, mas "a" não.
const int * const a
declara "a" como um ponteiro constante para um número inteiro constante. Nem "a" nem "* a" podem ser atribuídos.
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;
}