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

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 punterosarr + nsignifica “avanza n elementos”, no n bytes; el compilador ya cuenta el tamaño de cadaint.- El bucle
while (p < fin)recorre el array.*pda el elemento actual yp++avanza al siguienteint. 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.