Usted podría utilizar cdecl a entender lo que significa una declaración C.
const int **foo;
declare foo as pointer to pointer to const int
por lo que puede cambiar los punteros, pero no el valor que están apuntando.
int * const * const foo;
declare foo as const pointer to const pointer to int
esto, en cambio, es un puntero cosnt, que apunta a un puntero constante, a un int no constante: no se puede cambiar el valor en punta, pero se puede cambiar.
C utiliza el Clockwise/Spiral Rule, en un caso en el que sólo tiene modificadores en el lado izquierdo de la variable (de foo) que lee cosas pasando de derecha a izquierda:
int(5) *(4) const(3) *(2) const(1) foo;
foo
es una constante (1) puntero (2) a constante (3) puntero (4) a un entero (5).
int(6) const(5) *(4) const(3) *(2) const(1) foo;
const(6) int(5) *(4) const(3) *(2) const(1) foo; // [same as above]
En este caso foo
es una constante (1) puntero (2) a constante (3) puntero (4) a una (5) número entero constante (6) [oa un número entero (5) que está constante (6)].
¿Y un puntero de const a un puntero const a un const Foo? – sje397
@sje: const Foo * const * const foo; –