2010-01-18 10 views
9

¿Cuáles son las diferencias entre const y el puntero volátil en C?¿Cuáles son las diferencias entre const y el puntero volátil en C?

+4

Son completamente diferentes. ¿Has echado un vistazo a la documentación? –

+0

@Anon: pero tienen el contexto opuesto. La pregunta es legítima para un novato. +1 para equilibrar. –

+1

@the_drow: Parecen opuestos, pero 'const volatile' es un cv-qualifier perfectamente legítimo, lo que significa que" El programa no lo está cambiando, pero algo más podría hacer, o hacer el acceso podría hacer algo en sí mismo ". –

Respuesta

16

La diferencia realmente se reduce a la diferencia entre const y . Lo único que estos dos conceptos tienen en común es la sintaxis. const es implementado por el compilador y dice "el programador no puede cambiar esto". volatile dice "estos datos pueden ser cambiados por otra persona" y, por lo tanto, el compilador no hará ninguna suposición sobre esos datos. Sin volatile el compilador podría decir: "Puse estos datos de la memoria en un registro, y como no he hecho nada con esos datos, estoy seguro de que es el mismo y no necesito volver a leerlo en el registro. " Cuando los datos están marcados como volatile, el compilador no hará esa suposición (porque otra persona podría haber cambiado los datos) y por lo tanto volverá a leer los datos en el registro.

Ahora, ¿Usted está pidiendo la diferencia entre

int *const p; 

y

int *volatile q; 

o la diferencia entre

const int* p; 

y

volatile int* q; 

En el primer caso: p es un puntero a un int y donde que apunta el puntero no se pueden cambiar por el programador mientras que q es un puntero a una int y donde que apunta el puntero podría ser cambiado por alguien que no sea el programador por lo el compilador no hace suposiciones sobre ese puntero.

Así:

int *const p = (int*)malloc(sizeof(int)); 
int *volatile q = (int*)malloc(sizeof(int)); 
*p = 17; // legal; 
p = (int*)malloc(sizoef(int)); // not legal 
*q = 17; // legal; 
q = (int*)malloc(sizeof(int)); // legal 

En este último caso: p es un puntero a un int y lo p está señalando no puede ser cambiado por el programador mientras que q es un puntero a un int y lo q es señalar que podría ser cambiado por alguien que no sea el programador, por lo que el compilador no hace suposiciones sobre esos datos.

int i = 17; 
int j = 34; 
const int *p = &i; 
volatile int *q = &i; 
*p = 51; // not legal 
p = &j; // legal 
*q = 51; // legal 
q = &j; // legal 
+0

¡Gran respuesta! +1 –

+0

Otro uso legítimo para 'volátil' es cuando el acto de acceder a los datos es significativo en sí mismo, lo que es bastante probable en E/S mapeadas en memoria. En 1.9 (6) del Estándar, el "comportamiento observable" se define como "la secuencia de lecturas y escrituras en datos 'volátiles' y llamadas a las funciones de E/S de la biblioteca". –

1

He aquí una explicación de esos dos conceptos

La palabra clave const especifica que el puntero no se puede modificar después de la inicialización; el puntero está protegido de la modificación a partir de entonces.

La palabra clave volátil especifica que el valor asociado con el nombre que sigue se puede modificar mediante acciones distintas a las de la aplicación del usuario. Por lo tanto, la palabra clave volátil es útil para declarar objetos en la memoria compartida a los que se puede acceder mediante múltiples procesos o áreas de datos globales utilizados para la comunicación con rutinas de servicio de interrupción.

viene de here

1

Un puntero const (es decir const char* s = ..) puntos de datos que pueden no ser modificados. Un puntero volátil (es decir, volatile char* s = ...) sugiere que el compilador no almacena en caché los datos a los que hace referencia el puntero en los registros de la CPU o en otro lugar. En cambio, se vuelven a leer desde su ubicación de memoria original cada vez que se necesitan. Esto es necesario si el contenido de los datos puede cambiar fuera del alcance del compilador, por ejemplo, a través de un segundo hilo que lo modifique.

Tenga cuidado, const char* y char* const son cosas diferentes, lo mismo para el calificador volatile. Si no está seguro, búsquelos.

2

Normalmente, const o volatile se aplica a la punta, no al puntero en sí.

const significa que no tiene permitido modificar la punta a través de ese puntero.

volatile significa que alguien/algo más puede modificar la punta, aunque su código no lo haga. También significa que escribir en la variable podría hacer algo más que almacenar un valor que se recuperará la próxima vez que se use esa variable. Como resultado, cada vez que su código lee o escribe un valor volátil, el compilador está obligado a generar código que lea desde (o escriba en) la memoria real, no solo (por ejemplo) asigna un registro para uso temporal, y lee/escribe el registro.

Editar: Tenga en cuenta que, aunque no está autorizado a modificar los datos mediante un puntero const, los datos pueden modificarse por otros medios. De hecho, hay ocasiones en que puede tener un punto que sea constyvolatile, lo que significa que no puede cambiarlo, pero alguien más podría hacerlo.

+0

Depende si es 'const char * p' o' char * const p'. Puede razonablemente tener 'const char * const p'. –

Cuestiones relacionadas