Ejercicio 04 — Recorrer un array con un puntero

Dificultad: amarillo · Módulo 07 (Punteros)

Enunciado

Recorrer un array con un puntero (sin usar arr[i]), imprimiendo cada elemento con su indice calculado como p - arr.

Diagrama de flujo

Diagrama de flujo del ejercicio 04

Cómo se resuelve

Este ejercicio muestra la relación íntima entre punteros y arrays: el nombre de un array es un puntero a su primer elemento. Por eso int *p = arr; (sin corchetes ni &) hace que p apunte a arr[0].

  • int *fin = arr + n; apunta una posición más allá del último elemento. Es un centinela: no se lee, solo sirve para saber cuándo parar. En aritmética de punteros arr + n significa “avanza n elementos”, no n bytes; el compilador ya cuenta el tamaño de cada int.
  • El bucle while (p < fin) recorre el array. *p da el elemento actual y p++ avanza al siguiente int.
  • int indice = (int)(p - arr); — restar dos punteros del mismo array da cuántos elementos hay entre ellos, es decir, el índice actual. De nuevo, no da bytes sino posiciones.

Trampa habitual: confundir p++ con (*p)++. p++ mueve el puntero a la siguiente celda (lo que aquí queremos); (*p)++ incrementaría el valor almacenado y dejaría el puntero clavado, provocando un bucle infinito. Y ojo con pasarse del fin: leer *p fuera del array es comportamiento indefinido.

Para practicar — cópialo en Dev-C++

Pega este esqueleto y completa los TODO. Es la mejor forma de aprender: inténtalo antes de mirar la solución.

/*
 * Curso de C — Modulo 07: Punteros
 * Ejercicio 04 — PRACTICA (rellena los TODO)
 * Enunciado: Recorrer un array con un puntero (sin usar arr[i]),
 *            imprimiendo cada elemento con su indice calculado como p - arr.
 * Dificultad: amarillo
 * Compilar: gcc -std=c11 -Wall ej04_practica.c -o ej04 && ./ej04
 */
 
#include <stdio.h>
 
int main(void) {
    int arr[] = {3, 1, 4, 1, 5, 9, 2, 6};
    int n = (int)(sizeof(arr) / sizeof(arr[0]));
 
    // TODO 1: Declara un puntero 'p' que apunte al primer elemento de arr.
    //         (El nombre del array sin corchetes ES un puntero a arr[0])
 
    // TODO 2: Declara un puntero 'fin' que apunte al elemento DESPUES del ultimo.
    //         fin = arr + n;  -> este es el centinela del bucle
 
    // TODO 3: Escribe un bucle while(p < fin) que:
    //         a) Calcule el indice como: int indice = (int)(p - arr);
    //         b) Imprima:  [indice] = *p
    //            Formato exacto: "[%d] = %d\n"
    //         c) Avance p con p++
 
    return 0;
}

Solución — cópiala y ejecútala

/*
 * Curso de C — Modulo 07: Punteros
 * Ejercicio 04 — MODELO (resuelto)
 * Enunciado: Recorrer un array con un puntero (sin usar arr[i]),
 *            imprimiendo cada elemento con su indice calculado como p - arr.
 * Dificultad: amarillo
 * Compilar: gcc -std=c11 -Wall ej04_modelo.c -o ej04 && ./ej04
 */
 
#include <stdio.h>
 
int main(void) {
    int arr[] = {3, 1, 4, 1, 5, 9, 2, 6};
    int n = (int)(sizeof(arr) / sizeof(arr[0]));  // numero de elementos
 
    int *p = arr;         // apunta al primer elemento
    int *fin = arr + n;   // apunta "pasado el ultimo" (centinela)
 
    while (p < fin) {
        int indice = (int)(p - arr);  // diferencia de punteros = indice
        printf("[%d] = %d\n", indice, *p);
        p++;  // avanza al siguiente int
    }
 
    return 0;
}

Cómo usarlo

Dev-C++ (Windows): Archivo → Nuevo → Código fuente, pega el código y pulsa F11 (compilar y ejecutar). Si ves los acentos raros en la consola, escribe chcp 65001 y vuelve a ejecutar.

Conexiones