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.
Desafío
FácilEscribe un programa en C que implemente y demuestre la clásica función de intercambio (swap) utilizando punteros. Tu programa debe:
- Crear una función llamada
swapque reciba dos punteros a enteros como parámetros - 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 - En la función
main, leer dos números enteros de la entrada del usuario - Imprimir los valores originales en el formato:
Before swap: a = [value], b = [value] - Llamar a la función
swapy pasar las direcciones de ambas variables utilizando el operador de dirección (address-of) - 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;
}Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Logic & Flow
1Fundamentos de Punteros
¿Qué es un puntero?Declaración de punterosEl operador de dirección (&)El operador de desreferencia (*)Punteros NULLResumen: Conceptos básicos de punteros4Proyecto: Utilidad de texto simple
Descripción general del proyectoContar caracteres2Punteros y Arrays
Nombres de Arrays como PunterosElementos de un Array - PunterosAritmética de PunterosComparación de PunterosResumen: Recorrido de Arrays con Punteros5Punteros y funciones
Paso por valorPasar punteros a funcionesModificar variables mediante punterosUn ejemplo clásico: Intercambio (Swap)Pasar arrays a funcionesResumen: Argumentos de punteros a funciones3Arreglos de caracteres y cadenas
Cadenas como arreglos de charEl terminador nuloEntrada de cadenas con scanfUso de strlen()Uso de strcpy()Uso de strcat()Uso de strcmp()Resumen: Funciones básicas de cadenas