Ejercicio 03 — Función swap(int *a, int *b) que intercambia dos enteros por…

Dificultad: verde · Módulo 07 (Punteros)

Enunciado

Función swap(int *a, int *b) que intercambia dos enteros por referencia.

Diagramas de flujo

Diagrama de flujo (actividad) del ejercicio 03

Diagrama de flujo (grafo) del ejercicio 03

Cómo se resuelve

El intercambio (swap) es el ejemplo clásico del paso por referencia. Para intercambiar dos valores necesitas modificar las dos variables del llamador, y eso solo se puede si la función recibe sus direcciones.

  • swap(int *a, int *b) recibe dos punteros. Dentro trabajas siempre con *a y *b (los valores), nunca con a y b a secas (las direcciones).
  • Hace falta una variable temporal: int tmp = *a; guarda el valor de la primera antes de pisarlo. Luego *a = *b; y *b = tmp;. Sin ese tmp perderías uno de los dos valores en el primer paso.
  • En main, la llamada es swap(&x, &y); con los & para pasar las direcciones.

Trampa habitual: intentar el swap sin punteros, con void swap(int a, int b). Compila, pero solo intercambia las copias locales y x e y quedan intactas. Si la salida imprime lo mismo antes y después, casi seguro olvidaste los * en la función o los & en la llamada.

Para practicar — cópialo y complétalo

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 03 — PRACTICA (rellena los TODO)
 * Enunciado: Función swap(int *a, int *b) que intercambia dos enteros por referencia.
 * Dificultad: verde
 * Compilar: gcc -std=c11 -Wall ej03_practica.c -o ej03 && ./ej03
 */
 
#include <stdio.h>
 
/*
 * TODO 1: Define void swap(int *a, int *b).
 *         Necesitas una variable temporal 'tmp' para no perder un valor.
 *         Pasos: tmp = *a  |  *a = *b  |  *b = tmp
 */
 
int main(void) {
    int x = 5, y = 20;
 
    printf("Antes:   a=%d b=%d\n", x, y);
 
    // TODO 2: Llama a swap pasando las DIRECCIONES de x e y.
 
    printf("Despues: a=%d b=%d\n", x, y);
 
    return 0;
}

Solución — cópiala y ejecútala

/*
 * Curso de C — Modulo 07: Punteros
 * Ejercicio 03 — MODELO (resuelto)
 * Enunciado: Función swap(int *a, int *b) que intercambia dos enteros por referencia.
 * Dificultad: verde
 * Compilar: gcc -std=c11 -Wall ej03_modelo.c -o ej03 && ./ej03
 */
 
#include <stdio.h>
 
/* Intercambia los valores de *a y *b usando una variable temporal */
void swap(int *a, int *b) {
    int tmp = *a;  // guardamos el valor de a
    *a = *b;       // a recibe el valor de b
    *b = tmp;      // b recibe el valor original de a
}
 
int main(void) {
    int x = 5, y = 20;
 
    printf("Antes:   a=%d b=%d\n", x, y);
    swap(&x, &y);
    printf("Despues: a=%d b=%d\n", x, y);
 
    return 0;
}

Ejecútalo en el navegador

▶ Abrir y ejecutar en Compiler Explorer

Se abre con la solución ya cargada; pulsa el botón de ejecutar (Run) para ver la salida. No hay que instalar nada.

Cómo usarlo

Pega el código en un fichero y ejecútalo con tu toolchain habitual (o el botón de Ejecutar de tu editor). Antes de mirar la solución, intenta completar tú el esqueleto: es la mejor forma de aprender.

Conexiones