8.2.2. Puntero constante

Para conseguir que el puntero sea inalterable, debe colocar el especificador const a la derecha del *:

int d = 1;
int * const w = &d;

Ahora, se lee «w es un puntero constate, y apunta a un entero». Como el puntero en sí es ahora una constante, el compilador obliga a darle un valor inicial que no podrá alterarse durante la vida del puntero. En cualquier caso, puede cambiar el valor de lo que apunta el puntero con algo como:

*w = 2;

También puede hacer un puntero constante a un elemento constante usando una de las formas siguientes:

int d = 1;
const int* const x = &d;  // (1)
int const* const x2 = &d; // (2)

Ahora ni el puntero ni el elemento al que apunta pueden modificarse.

Algunos argumentan que la segunda forma es más consistente porque el const se coloca siempre a la derecha de lo que afecta. Debe decidir que forma resulta más clara para su estilo de codificación particular.

Algunas líneas de un archivo susceptible de ser compilado.

//: C08:ConstPointers.cpp
const int* u;
int const* v;
int d = 1;
int* const w = &d;
const int* const x = &d;  // (1)
int const* const x2 = &d; // (2)
int main() {} ///:~

Listado 8.3. C08/ConstPointers.cpp


Formato

Este libro sigue la norma de poner sólo una definición de puntero por línea, e inicializar cada puntero en el punto de definición siempre que sea posible. Por eso, el estilo es colocar el * al lado del tipo:

int* u = &i;

como si int* fuese un tipo de dato básico. Esto hace que el código sea más fácil de leer, pero desafortunadamente, esta no es la forma en que funciona. El «*» se refiere al identificador no al tipo. Se puede colocar en cualquier sitio entre el nombre del tipo y el identificador. De modo que puede hacer esto:

int * u = &i, v = 0;

donde se crea un int* u y después un int v (que no es puntero). Como esto puede parecer confuso a los lectores, es mejor utilizar el estilo mostrado en este libro.