¿Cuál es la diferencia entre char * const y const char *?

Resuelto LB. asked hace 15 años • 19 respuestas

Cuál es la diferencia entre:

char * const 

y

const char *
LB. avatar May 21 '09 05:05 LB.
Aceptado

La diferencia es que const char *es un puntero a a const char, mientras que char * constes 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 constelemento sea la misma que con un puntero const.

workmad3 avatar May 20 '2009 22:05 workmad3

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;
diapir avatar May 21 '2009 00:05 diapir

constsiempre 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 i1y i2los puntos, pero no puede cambiar el valor al que apuntan.

Este:

int *const i3 = (int*) 0x12345678;

define un constpuntero a un número entero y lo inicializa para que apunte a la ubicación de memoria 12345678. Puede cambiar el intvalor en la dirección 12345678, pero no puede cambiar la dirección a la que i3apunta.

Don McCaughey avatar May 20 '2009 22:05 Don McCaughey

Regla general: ¡ lea la definición de derecha a izquierda!


const int *foo;

Significa " fooapunta ( *) a algo intque no puede cambiar ( const)".
Para el programador esto significa "No cambiaré el valor de lo que fooapunta".

  • *foo = 123;o foo[0] = 123;sería inválido.
  • foo = &bar;esta permitido.

int *const foo;

Significa " foono se puede cambiar ( const) y señala ( *) a int".
Para el programador esto significa "No cambiaré la dirección de memoria a la que foohace referencia".

  • *foo = 123;o foo[0] = 123;está permitido.
  • foo = &bar;sería inválido.

const int *const foo;

Significa " foono se puede cambiar ( const) y señala ( *) a intque no se puede cambiar ( const)".
Para el programador esto significa "No cambiaré el valor de lo que fooapunta, ni cambiaré la dirección a la que foohace referencia".

  • *foo = 123;o foo[0] = 123;sería inválido.
  • foo = &bar;sería inválido.
Mr. Llama avatar Jul 08 '2016 00:07 Mr. Llama