Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

143
Vistas
¿Por qué el valor de un puntero a int no puede ser el valor de un puntero a una const int?

¿Por qué es esto incorrecto? El problema es que al asignar b = p recibo la siguiente advertencia: la assignment discards 'const' qualifiers from pointer target type .

 int a = 4; int *b; const int *p = &a; b = p;
over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

Tiene un puntero que está definido para apuntar a un int que permite cambiar, b ; pero no lo inicias al principio.

Luego introduce un puntero a un int que no permite que se cambie.
Y lo apuntas a un int existente. Es decir, "Mira ese int, pero no lo cambies".

Luego, intenta asignar el valor del puntero "no toques esto" al puntero "oye, ten un int, haz lo que quieras".
El compilador le dice que es inconsistente allí, que se está contradiciendo a sí mismo y que realmente no puede querer decir lo que escribe en su código.

Por eso es incorrecto. Porque violas las reglas que tú mismo escribiste.

over 4 years ago · Santiago Trujillo Denunciar

0

p es un puntero a un int constante y lo está asignando a un puntero a un int no constante.

over 4 years ago · Santiago Trujillo Denunciar

0

p se define como un puntero const a int , lo que significa que no se puede usar para modificar el int al que apunta. Puede inicializarlo desde la dirección de un int que puede modificarse o no. Por el contrario, b es un puntero a int que se puede usar para modificar el int al que apunta. Solo debe inicializarse desde un puntero a int con la misma habilidad o la dirección de un int que sea modificable. b = p viola esta restricción, de ahí la advertencia.

Tenga en cuenta que b = &a está bien ya que a es modificable y p = b también está bien, solo restringiendo que p se use para modificar a .

Podría intentar silenciar la advertencia emitiendo p como (int *)p , pero no se recomienda: en este caso particular, p apunta a un int que se puede modificar, pero omitir la validación constante por parte del compilador hace que el código sea menos legible y más propenso a errores.

Calificar p como const int *p es una promesa que dice que no usaré p para modificar lo que apunta . La necesidad de romper esta promesa es una indicación de que algo no está bien estructurado en el programa.

No existe una forma recomendada de silenciar esta advertencia, pero simplemente puede cambiar el código para inicializar b desde &a esta manera:

 int a = 4; int *b = &a; const int *p = b;

Con el pedido publicado, podría escribir casualmente b = (int *)p; para tratar de silenciar la advertencia, pero un buen compilador como clang con advertencias habilitadas aún le advertirá con razón que este elenco es sospechoso ...

Si realmente necesita eliminar la constancia y desea silenciar la advertencia que aún ocurre con el obvio b = (int *)p; , podrías escribir esto:

 b = (int *)(uintptr_t)(const void *)p; // avoid this!
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda