Menu
Coddy logo textTech

Un ejemplo clásico: Intercambio (Swap)

Parte de la sección Logic & Flow del Journey de C de Coddy — lección 28 de 63.

La función swap es uno de los ejemplos más famosos que demuestra por qué los punteros son esenciales en la programación en C. El objetivo es sencillo: escribir una función que intercambie los valores de dos variables. Sin embargo, esta tarea aparentemente sencilla revela una limitación fundamental del paso por valor (pass-by-value).

Considera qué sucede si intentas intercambiar dos variables usando el paso por valor regular:

void badSwap(int a, int b) {
    int temp = a;
    a = b;
    b = temp;
    // ¡Esto solo intercambia las copias, no las variables originales!
}

Este enfoque falla porque la función solo recibe copias de los valores. Las variables originales en la función que realiza la llamada permanecen sin cambios.

La solución requiere pasar punteros a las variables en su lugar:

void swap(int *a, int *b) {
    int temp = *a;  // Almacena el valor en la dirección a
    *a = *b;        // Coloca el valor de la dirección b en la dirección a
    *b = temp;      // Coloca el valor almacenado en la dirección b
}

Al pasar las direcciones de las variables y usar el operador de desreferencia, la función puede modificar directamente los valores de las variables originales. Esto convierte a la función swap en una demostración perfecta de cuándo y por qué se necesitan punteros para realizar tareas que el paso por valor simplemente no puede manejar.

challenge icon

Desafío

Fácil

Escribe un programa en C que implemente y demuestre la clásica función de intercambio (swap) utilizando punteros. Tu programa debe:

  1. Crear una función llamada swap que reciba dos punteros a enteros como parámetros
  2. Dentro de la función swap, intercambiar los valores en las direcciones de memoria a las que apuntan los dos punteros utilizando una variable temporal
  3. En la función main, leer dos números enteros de la entrada del usuario
  4. Imprimir los valores originales en el formato: Before swap: a = [value], b = [value]
  5. Llamar a la función swap y pasar las direcciones de ambas variables utilizando el operador de dirección (address-of)
  6. Después de la llamada a la función, imprimir los valores intercambiados en el formato: After swap: a = [value], b = [value]

Tu salida debe demostrar que la función intercambia con éxito los valores de las variables originales:

Before swap: a = [first_input], b = [second_input]
After swap: a = [second_input], b = [first_input]

Este desafío demuestra por qué los punteros son esenciales para la operación de intercambio: la función debe acceder a las ubicaciones de memoria de las variables originales para intercambiar sus valores de forma permanente, lo cual es imposible con el paso por valor.

Hoja de referencia

La función swap demuestra por qué los punteros son esenciales en C. El paso por valor no puede intercambiar las variables originales porque las funciones solo reciben copias:

void badSwap(int a, int b) {
    int temp = a;
    a = b;
    b = temp;
    // ¡Esto solo intercambia las copias, no las variables originales!
}

El enfoque correcto utiliza punteros para acceder y modificar las variables originales:

void swap(int *a, int *b) {
    int temp = *a;  // Almacena el valor en la dirección a
    *a = *b;        // Coloca el valor de la dirección b en la dirección a
    *b = temp;      // Coloca el valor almacenado en la dirección b
}

Al pasar direcciones y usar el operador de desreferencia (*), la función puede modificar directamente los valores de las variables originales.

Pruébalo tú mismo

#include <stdio.h>

// TODO: Escribe tu función de intercambio aquí

int main() {
    int a, b;
    
    // Leer entrada
    scanf("%d", &a);
    scanf("%d", &b);
    
    // Imprimir valores originales
    printf("Before swap: a = %d, b = %d\n", a, b);
    
    // TODO: Llama a tu función de intercambio aquí
    
    // Imprimir valores intercambiados
    printf("After swap: a = %d, b = %d\n", a, b);
    
    return 0;
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Logic & Flow