¿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?

La diferencia realmente se reduce a la diferencia entre const y volatile . Lo único que estos dos conceptos tienen en común es la syntax. const se aplica en el comstackdor y dice “el progtwigdor no puede cambiar esto”. volatile dice que “esta información podría ser cambiada por otra persona” y, por lo tanto, el comstackdor no hará ninguna suposición sobre esos datos. Sin volatile el comstackdor podría decir “Pongo estos datos de la memoria en un registro, y como no he hecho nada con esos datos, estoy seguro de que es lo mismo y no necesito volver a leerlos en el registro”. ” Cuando los datos se marcan como volatile el comstackdor no hará tal suposición (porque alguien más podría haber cambiado los datos) y por lo tanto volverá a leer los datos en el registro.

Ahora, ¿estás 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 el progtwigdor no puede cambiar esos puntos de puntero, mientras que q es un puntero a un int y donde esos puntos de puntero pueden ser cambiados por alguien que no sea el progtwigdor, por lo que el comstackdor hace No hay suposiciones sobre ese puntero.

Asi que:

 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 el progtwigdor no puede cambiar lo que está apuntando a p mientras que q es un puntero a un int y lo que está apuntando a q puede ser cambiado por alguien que no sea el progtwigdor, por lo que El comstackdor 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 

Normalmente, const o volatile aplica al pointee, no al puntero en sí.

const significa que no está permitido modificar el pointee a través de ese puntero.

volatile significa que alguien / algo más podría modificar el pointee, aunque su código no lo haga. También significa que escribir en la variable puede hacer algo más que almacenar un valor para recuperarlo 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 comstackdor está obligado a generar código que lee (o escribe) en la memoria real, no solo (por ejemplo) asigna un registro para uso temporal, y lee / escribe el registro.

Edición: tenga en cuenta que aunque no se le permita modificar los datos mediante un puntero de const , los datos pueden modificarse por otros medios. De hecho, hay veces en que puedes tener un pointee que es a la vez const y volatile , lo que significa que no puedes cambiarlo, pero alguien más podría hacerlo.

Aquí hay 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 puede ser modificado por acciones distintas a las de la aplicación de 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 utilizadas para la comunicación con las rutinas de servicio de interrupción.

Viene de aqui

Un puntero de const (es decir, const char* s = .. ) apunta a datos que no se pueden modificar. Un puntero volátil (es decir, el volatile char* s = ... ) sugiere que el comstackdor no almacena en caché los datos a los que hace referencia el puntero en los registros de la CPU, o en otra parte. En su lugar, 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 scope del comstackdor, por ejemplo, a través de un segundo hilo que lo modifica.

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