¿Cuál es la diferencia entre const int*, const int * const e int const *?

Resuelto asked hace 15 años • 23 respuestas

Siempre me equivoco sobre cómo usar const int*, const int * consty int const *correctamente. ¿Existe un conjunto de reglas que definan lo que se puede y lo que no se puede hacer?

Quiero saber todo lo que se debe y no se debe hacer en términos de asignaciones, paso a funciones, etc.

 avatar Jul 17 '09 20:07
Aceptado

Léalo al revés (según lo indicado por la regla en sentido horario/espiral ):

  • int*- puntero a int
  • int const *- puntero a constante int
  • int * const- puntero constante a int
  • int const * const- puntero constante a constante int

Ahora el primero constpuede estar a cualquier lado del tipo así:

  • const int *==int const *
  • const int * const==int const * const

Si quieres volverte realmente loco puedes hacer cosas como esta:

  • int **- puntero a puntero a int
  • int ** const- un puntero constante a un puntero a un int
  • int * const *- un puntero a un puntero constante a un int
  • int const **- un puntero a un puntero a un int constante
  • int * const * const- un puntero constante a un puntero constante a un int
  • ...

Si alguna vez no está seguro, puede utilizar una herramienta como cdecl+ para convertir declaraciones en prosa automáticamente.

Para asegurarnos de que tenemos claro el significado de const:

int a = 5, b = 10, c = 15;

const int* foo;     // pointer to constant int.
foo = &a;           // assignment to where foo points to.

/* dummy statement*/
*foo = 6;           // the value of a can´t get changed through the pointer.

foo = &b;           // the pointer foo can be changed.



int *const bar = &c;  // constant pointer to int 
                      // note, you actually need to set the pointer 
                      // here because you can't change it later ;)

*bar = 16;            // the value of c can be changed through the pointer.    

/* dummy statement*/
bar = &a;             // not possible because bar is a constant pointer.           

fooes un puntero variable a un número entero constante. Esto le permite cambiar lo que señala pero no el valor que señala. La mayoría de las veces, esto se ve con cadenas de estilo C donde tienes un puntero a un archivo const char. Puede cambiar la cadena a la que apunta, pero no puede cambiar el contenido de estas cadenas. Esto es importante cuando la cadena en sí está en el segmento de datos de un programa y no debe cambiarse.

bares un puntero constante o fijo a un valor que se puede cambiar. Esto es como una referencia sin el azúcar sintáctico adicional. Debido a este hecho, normalmente usaría una referencia donde usaría un T* constpuntero a menos que necesite permitir NULLpunteros.

Matt Price avatar Jul 17 '2009 13:07 Matt Price

Para aquellos que no conocen la regla en sentido horario/espiral: comience desde el nombre de la variable, muévase en el sentido de las agujas del reloj (en este caso, retroceda) hasta el siguiente puntero o escriba . Repita hasta que termine la expresión.

Aquí hay una demostración:

puntero a int

puntero constante a int constante

puntero a int constante

puntero a constante int

puntero constante a int

Shijing Lv avatar Jul 10 '2015 02:07 Shijing Lv

Creo que todo ya está respondido aquí, pero solo quiero agregar que debes tener cuidado con typedeflos s. NO son sólo reemplazos de texto.

Por ejemplo:

typedef char *ASTRING;
const ASTRING astring;

El tipo de astringes char * const, no const char *. Esta es una de las razones por las que siempre tiendo a escribir consta la derecha del tipo y nunca al principio.

Kaz Dragon avatar Jul 17 '2009 13:07 Kaz Dragon