¿Cuál es la diferencia entre char * const y const char *?
Cuál es la diferencia entre:
char * const
y
const char *
La diferencia es que const char *
es un puntero a a const char
, mientras que char * const
es un puntero constante a a char
.
El primero, el valor al que se apunta no se puede cambiar, pero el puntero sí. El segundo, el valor al que se apunta puede cambiar pero el puntero no (similar a una referencia).
También hay una
const char * const
que es un puntero constante a un carácter constante (por lo que no se puede cambiar nada al respecto).
Nota:
Las dos formas siguientes son equivalentes:
const char *
y
char const *
El motivo exacto de esto se describe en el estándar C++, pero es importante tenerlo en cuenta y evitar la confusión. Conozco varios estándares de codificación que prefieren:
char const
encima
const char
(con o sin puntero) para que la ubicación del const
elemento sea la misma que con un puntero const
.
Para evitar confusiones, agregue siempre el calificador const.
int * mutable_pointer_to_mutable_int;
int const * mutable_pointer_to_constant_int;
int *const constant_pointer_to_mutable_int;
int const *const constant_pointer_to_constant_int;
const
siempre modifica lo que viene antes (a la izquierda), EXCEPTO cuando es lo primero en una declaración de tipo, donde modifica lo que viene después (a la derecha).
Entonces estos dos son iguales:
int const *i1;
const int *i2;
Definen punteros a const int
. Puede cambiar dónde i1
y i2
los puntos, pero no puede cambiar el valor al que apuntan.
Este:
int *const i3 = (int*) 0x12345678;
define un const
puntero a un número entero y lo inicializa para que apunte a la ubicación de memoria 12345678. Puede cambiar el int
valor en la dirección 12345678, pero no puede cambiar la dirección a la que i3
apunta.
Regla general: ¡ lea la definición de derecha a izquierda!
const int *foo;
Significa " foo
apunta ( *
) a algo int
que no puede cambiar ( const
)".
Para el programador esto significa "No cambiaré el valor de lo que foo
apunta".
*foo = 123;
ofoo[0] = 123;
sería inválido.foo = &bar;
esta permitido.
int *const foo;
Significa " foo
no se puede cambiar ( const
) y señala ( *
) a int
".
Para el programador esto significa "No cambiaré la dirección de memoria a la que foo
hace referencia".
*foo = 123;
ofoo[0] = 123;
está permitido.foo = &bar;
sería inválido.
const int *const foo;
Significa " foo
no se puede cambiar ( const
) y señala ( *
) a int
que no se puede cambiar ( const
)".
Para el programador esto significa "No cambiaré el valor de lo que foo
apunta, ni cambiaré la dirección a la que foo
hace referencia".
*foo = 123;
ofoo[0] = 123;
sería inválido.foo = &bar;
sería inválido.