const int * i;
i
es un puntero a entero constante. i
se puede cambiar para que apunte a un valor diferente, pero el valor apuntado por i
no se puede cambiar.
int * const i;
i
es un puntero constante a un número entero no constante. El valor apuntado por i
se puede cambiar, pero i
no se puede cambiar para apuntar a un valor diferente.
const volatile int ip;
Ésta es un poco complicado. El hecho de que ip
es const
significa que el compilador no le permitirá cambiar el valor de ip
. Sin embargo, aún podría modificarse en teoría, p. tomando su dirección y usando el operador const_cast
. Esto es muy peligroso y no es una buena idea, pero está permitido. El calificador volatile
indica que en cualquier momento que se acceda a ip
, siempre se debe volver a cargar desde la memoria, es decir, NO se debe almacenar en caché en un registro. Esto evita que el compilador realice ciertas optimizaciones. Desea utilizar el calificador volatile
cuando tenga una variable que pueda ser modificada por otro hilo, o si está utilizando E/S mapeadas en memoria, u otras situaciones similares que podrían causar un comportamiento que el compilador podría no estar esperando. Usar const
y volatile
en la misma variable es bastante inusual (pero legal); por lo general, verá uno pero no el otro.
const int *i;
Esto es lo mismo que la primera declaración.
Si va a editar por gramática y ortografía, ¿por qué no escribe "Si" con una 'I' y no con un '!'? – Eclipse