2011-05-03 31 views

Respuesta

11

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.

+0

Explicación muy sólida, hay que pensar en el hecho de que el objeto puntero en sí es solo una dirección. –

+0

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

+0

@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

0

Desde b puntos en la misma memoria que a, el valor de cambio de rumbo. No estoy seguro de por qué también introdujo c, pero no agrega nada. Imprimirá 2.

+0

incluso si b es const yc no lo es? – BlackBear

0

*b sería 2 porque la última línea antes del printf que establece el valor es *c = 2.

a, b y c apuntan al mismo valor entero. Entonces, el último en establecerlo determinará su valor actual.

0

b debe ser 2 en printf(). Manejas un puntero todo el tiempo en byc.

0

La declaración const int *b = a; significa que b se refiere a un valor int constante. Lo que quiere decir que trata su valor como un valor constante.

Por lo tanto,

*b = 10; 

es incorrecto, pero:

a = 10; 

está muy bien ya que una no es un valor constante, pero cuando dereferencing b tratamos como constante.

Así b es, sin duda definido ya ha cambiado el valor que señaló:

c = 2; 

que es el mismo que el ejemplo anterior. En pocas palabras, un puntero a un valor constante no puede modificar el valor a través de la desreferenciación, pero el valor al que apunta puede modificarse.

2

Lo que dice la norma IS (el subrayado es mío)

6,7.3/5

Si se hace un intento de modificar un objeto definida con un const-cualificado tipo a través del uso de un lvalue con el tipo no const-calificado, el comportamiento es indefinido.

Esto no se aplica a su situación (al revés).
El objeto en cuestión se definió con un tipo simple (int).

En su situación, solo son válidos los cambios en el objeto a través de b; los cambios a través de a o c son perfectamente legales

Cuestiones relacionadas