const pointer en C: ejercicio resuelto

const pointer en C: ejercicio resuelto

Si buscas const pointer en C ejercicio resuelto, aquí tienes las tres combinaciones de const con punteros, con ejemplos que muestran qué está permitido y qué el compilador rechaza.

La regla es leer la declaración de derecha a izquierda: el const más cercano al nombre de variable congela el puntero; el const más cercano al tipo base congela el valor apuntado.

Enunciado

Declara y usa las tres variantes:

  1. const int *p — puntero a entero constante (no puede modificar el valor).
  2. int * const p — puntero constante a entero (no puede cambiar a dónde apunta).
  3. const int * const p — puntero constante a entero constante.

Muestra qué operaciones son válidas e inválidas para cada una.

Solución en C

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <stdio.h>

int main(void) {
    int x = 10, y = 20;

    /* ── 1. Puntero a entero constante ──────────────────────────────
       El puntero puede cambiar a dónde apunta,
       pero no puede modificar el valor apuntado.              */
    const int *p1 = &x;
    printf("p1  -> %d\n", *p1);

    p1 = &y;                    /* OK: cambia el destino */
    printf("p1  -> %d\n", *p1);
    /* *p1 = 99; */             /* ERROR: no puede modificar el valor */

    /* ── 2. Puntero constante a entero ──────────────────────────────
       No puede cambiar a dónde apunta,
       pero sí puede modificar el valor apuntado.              */
    int * const p2 = &x;
    printf("p2  -> %d\n", *p2);

    *p2 = 42;                   /* OK: modifica el valor */
    printf("p2  -> %d  (x=%d)\n", *p2, x);
    /* p2 = &y; */              /* ERROR: no puede cambiar el destino */

    /* ── 3. Puntero constante a entero constante ────────────────────
       No puede cambiar ni el destino ni el valor.             */
    const int * const p3 = &x;
    printf("p3  -> %d\n", *p3);
    /* *p3 = 99; */             /* ERROR: no puede modificar el valor */
    /* p3 = &y; */              /* ERROR: no puede cambiar el destino */

    return 0;
}

Resultado esperado

1
2
3
4
5
p1  -> 10
p1  -> 20
p2  -> 10
p2  -> 42  (x=42)
p3  -> 42

Errores frecuentes

  • Confundir qué es constante: const int *p congela el valor, no el puntero; int * const p congela el puntero, no el valor.
  • Asignar un puntero const a un puntero no-const sin cast: int *q = p1; genera advertencia del compilador porque se perdería la protección const.
  • Intentar modificar el valor a través de un const int * usando un cast para eliminar const: es comportamiento indefinido si el objeto original fue declarado const.
  • No inicializar un int * const en la declaración: un puntero constante debe inicializarse donde se declara (no puede reasignarse después).

Aplicación práctica

const int * se usa en parámetros de funciones para garantizar que no se modifique el dato original (strcmp, strlen, printf usan const char *). int * const aparece en registros de hardware embebido donde la dirección es fija pero el valor es de escritura. const int * const expresa un puntero completamente inmutable, útil para tablas de configuración de solo lectura.

Siguiente ejercicio recomendado

Práctica guiada y libro completo

Si quieres una ruta completa con progresión real de dificultad:

FAQ

¿Por qué el compilador avisa si asigno const int * a int *?

Porque al perder el const se abre la posibilidad de modificar datos que el programador marcó como inmutables. El compilador genera una advertencia (o error en modo estricto) para señalar que se está eliminando protección de forma implícita.

¿Qué significa const en el parámetro const char *s de printf?

Significa que printf se compromete a no modificar la cadena apuntada por s. Es una garantía al llamador: puedes pasar una cadena literal (que vive en memoria de solo lectura) sin riesgo de que printf la modifique.

¿Cómo se lee const int * const *pp?

De derecha a izquierda: pp es un puntero (*pp) no constante, que apunta a un puntero constante (* const) a un entero constante (const int). En la práctica, el doble nivel es raro, pero aparece en tablas de punteros a strings de solo lectura como const char * const argv[].