Código
void funcion(const char * const * cadenas) { cadenas = 0xFFFFFFFF; }
Si yo compilo este código, no me dará un error como tal (simplemente una advertencia). Lo que me resulta raro es que si este código compila, significa que el último puntero es el que está tomando prioridad, porque el const opera sobre lo que tiene a su izquierda (a no ser que esté a la izquierda del todo, que en cuyo caso, opera sobre lo que tiene a la derecha). Es decir:
Código
void funcion(const char * const * cadenas) ^
Este const opera sobre el char
Código
void funcion(const char * const * cadenas) ^ ^
Este const opera sobre el puntero señalado
Entones de esto deducimos que el único puntero no constante es el último. Al poder modificar en la función el valor del puntero dado, eso quiere decir que el último puntero es el que está tomando prioridad, mientras que debería tomar prioridad el primer puntero, es decir, este:
Código
void funcion(const char * const * cadenas) ^
La duda final podría ser: por lo visto no entiendo/sé muy bien las reglas de prioridad, porque yo creía que al ser el mismo operador (*), tenía prioridad el de más a la izquierda, pero según lo expuesto, y en este caso, tiene más prioridad el de más a la derecha...