Se imprimirá 2. const int *b
significa literalmente:
puntero a un entero cuyo valor no puede ser alterado a través de su dereferentiation.
Esto no significa que el valor al que apunta el puntero no cambie. De hecho, es perfectamente válido para cambiar. Un escenario probable para usar esto, son estructuras que mantienen una referencia de solo lectura a alguna estructura grande. La referencia puede cambiar, pero las funciones que trabajan con esa estructura pueden no cambiar lo que está detrás del puntero.
Imagine un controlador o similar que entregue una asignación de memoria de solo lectura de los datos entregados por el dispositivo: la dirección de la asignación no es constante, pero dado que se trata de una asignación de solo lectura, el programa no puede escribir en ella. OTOH cuando el dispositivo actualiza los datos cambiará el contenido del búfer, pero no necesariamente la dirección de asignación.
Explicación muy sólida, hay que pensar en el hecho de que el objeto puntero en sí es solo una dirección. –
Este fue mi caso: un elemento en una estructura definida como puntero a const para datos que pueden ser cambiados por otras funciones. Es mi primera vez aquí, ¡todas las respuestas fueron demasiado rápidas! – misianne
@misianne: De hecho, la palabra "const" cuando se usa de esta manera con punteros es un poco engañosa porque te hace pensar en const-ness (inmutabilidad) mientras que de hecho es más como "readonly". El punto clave es que cuando dices 'const int * p' estás diciendo algo sobre ** el puntero ** (es decir, que no se puede usar para escribir), no sobre el ** objeto puntiagudo ** (que puede no ser constante en absoluto). – 6502