¿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?
Respuesta
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
¡Gran respuesta! +1 –
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". –
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
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.
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 const
yvolatile
, lo que significa que no puede cambiarlo, pero alguien más podría hacerlo.
Depende si es 'const char * p' o' char * const p'. Puede razonablemente tener 'const char * const p'. –
- 1. puntero volátil y const
- 2. ¿Cuáles son las diferencias entre $ {} y # {}?
- 3. ¿Cuáles son las diferencias entre C# .net y Visual Basic.net?
- 4. ¿Cuáles son las diferencias de uso entre size_t y off_t?
- 5. ¿Cuáles son las diferencias entre el objeto JSON y JavaScript?
- 6. ¿Cuáles son las diferencias entre typedef y el uso?
- 7. Cuáles son las diferencias en JIT entre Java y .Net
- 8. ¿Cuáles son las diferencias entre ConcurrentQueue y BlockingCollection en .Net?
- 9. ¿Cuáles son las diferencias entre RedrawWindow y UpdateWindow en Win32?
- 10. ¿Cuáles son las diferencias entre ADOdb y PDO en PHP?
- 11. ¿Cuáles son las diferencias y similitudes entre MVC y MVVM?
- 12. ¿Cuáles son las diferencias entre un compilador y un enlazador?
- 13. ¿Cuáles son las diferencias entre "=" y "<-" en R?
- 14. ¿Cuáles son las diferencias entre INSERT y UPDATE en MySQL?
- 15. ¿Cuáles son las diferencias entre HasOne y References en nhibernate?
- 16. ¿Cuáles son las principales diferencias entre fwrite y write?
- 17. ¿Cuáles son las diferencias entre JSP, PHP, HTML5 y javascript?
- 18. ¿Cuáles son las diferencias entre g ++ versión 4.0.0.8 y 4.3.2?
- 19. ¿Cuáles son las diferencias entre Vanilla Perl y Strawberry Perl?
- 20. ¿Cuáles son las principales diferencias entre Cocoa y CocoaTouch?
- 21. ¿Cuáles son las diferencias entre usar `rails server` y` rackup`?
- 22. Cuáles son las diferencias entre display: box y display: flexbox
- 23. ¿Cuáles son las diferencias entre PEG y CFG?
- 24. ¿Cuáles son las diferencias actuales entre jQuery y Prototype?
- 25. ¿Cuáles son las diferencias entre la lechuga y la pictografía?
- 26. ¿Cuáles son las diferencias entre nil, NULL y [NSNULL nil]?
- 27. ¿Cuáles son las diferencias fundamentales entre OSGi y Java EE?
- 28. ¿Cuáles son las diferencias reales entre Zend Framework y Django?
- 29. ¿Cuáles son las diferencias entre HTTP 1.0 y 1.1?
- 30. ¿Cuáles son las diferencias entre touchmove y gesturechange?
Son completamente diferentes. ¿Has echado un vistazo a la documentación? –
@Anon: pero tienen el contexto opuesto. La pregunta es legítima para un novato. +1 para equilibrar. –
@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 ". –