Introducción
En la programación en C, los punteros son características poderosas que nos permiten manipular datos accediendo y modificando directamente las ubicaciones de memoria. Una aplicación común de los punteros es intercambiar valores entre dos variables sin utilizar una tercera variable.
En este laboratorio (lab), aprenderemos cómo crear un programa en C que intercambia dos números utilizando punteros. Esta técnica es fundamental en diversos escenarios de programación y demuestra el uso práctico de los punteros para la manipulación de memoria.
El laboratorio te guiará a través de la creación de un programa desde cero, su compilación y ejecución para ver el intercambio en acción.
Comprendiendo los punteros en C
Antes de comenzar a codificar, entendamos qué son los punteros y cómo funcionan en C.
¿Qué es un puntero?
Un puntero es una variable que almacena la dirección de memoria de otra variable. Los punteros son esenciales en C porque permiten el acceso directo a la memoria y facilitan una manipulación más eficiente de los datos.
Sintaxis de los punteros
En C, los punteros se declaran utilizando el asterisco (*) como símbolo:
int *ptr; // Declares a pointer to an integer
Cuando se trabaja con punteros, se utilizan dos operadores importantes:
- El operador de dirección (
&) - obtiene la dirección de memoria de una variable - El operador de desreferenciación (
*) - accede al valor almacenado en la dirección que contiene un puntero
Creando nuestro primer archivo
Comencemos creando nuestro archivo principal de C en el directorio del proyecto. Abra el IDE y cree un nuevo archivo llamado main.c:
- En el panel del explorador de archivos (lado izquierdo), navegue hasta
/home/labex/project - Haga clic derecho y seleccione "Nuevo archivo"
- Nombre el archivo
main.c - Agregue la siguiente estructura básica al archivo:
#include <stdio.h>
int main() {
// We will add our code here
return 0;
}
Esto crea un simple programa en C con la biblioteca estándar de entrada/salida incluida y una función principal que devuelve 0 cuando el programa se completa con éxito.
Creando la estructura del programa de intercambio
Ahora que entendemos los punteros, construyamos nuestro programa de intercambio paso a paso.
Declarando variables y punteros
Necesitamos declarar:
- Dos variables enteras (
ayb) para almacenar los valores que queremos intercambiar - Dos punteros enteros (
ptrayptrb) para almacenar las direcciones deayb - Una variable temporal (
temp) para ayudar con la operación de intercambio
Actualice su archivo main.c con el siguiente código:
#include <stdio.h>
int main() {
// Declare variables
int a, b;
int *ptra, *ptrb;
int temp;
// Get input from user
printf("Enter value for a: ");
scanf("%d", &a);
printf("Enter value for b: ");
scanf("%d", &b);
// Display original values
printf("\nOriginal values:\n");
printf("a = %d\n", a);
printf("b = %d\n", b);
// We will add more code here in the next step
return 0;
}
Comprendiendo el código
Analicemos lo que hemos hecho hasta ahora:
- Declaramos dos enteros
aybque almacenarán los valores que queremos intercambiar - Declaramos dos punteros enteros
ptrayptrbque almacenarán las direcciones de memoria deayb - Declaramos un entero temporal
tempque nos ayudará con la operación de intercambio - Añadimos código para solicitar al usuario que ingrese valores para
ayb - Añadimos código para mostrar los valores originales de
ayb
Note que en la función scanf, usamos el operador de dirección (&) para indicar a la función dónde almacenar los valores de entrada en memoria.
Implementando la lógica de intercambio
Ahora implementemos la lógica real de intercambio utilizando punteros.
Asignando direcciones a punteros
Primero, necesitamos hacer que nuestros punteros apunten a nuestras variables asignando las direcciones de a y b a ptra y ptrb respectivamente:
// Assign addresses to pointers
ptra = &a;
ptrb = &b;
El algoritmo de intercambio utilizando punteros
La clave para intercambiar valores con punteros es manipular los valores en las ubicaciones de memoria, no solo los punteros en sí. Así es como lo haremos:
- Almacenar el valor de
a(accedido a través de*ptra) en la variable temporaltemp - Asignar el valor de
b(accedido a través de*ptrb) aa(utilizando*ptra) - Asignar el valor temporal (valor original de
a) ab(utilizando*ptrb)
Actualice su archivo main.c agregando el siguiente código donde se indicó en el paso anterior:
#include <stdio.h>
int main() {
// Declare variables
int a, b;
int *ptra, *ptrb;
int temp;
// Get input from user
printf("Enter value for a: ");
scanf("%d", &a);
printf("Enter value for b: ");
scanf("%d", &b);
// Display original values
printf("\nOriginal values:\n");
printf("a = %d\n", a);
printf("b = %d\n", b);
// Assign addresses to pointers
ptra = &a;
ptrb = &b;
// Display memory addresses (optional but helpful for understanding)
printf("\nMemory addresses:\n");
printf("Address of a: %p\n", ptra);
printf("Address of b: %p\n", ptrb);
// Swap the values using pointers
temp = *ptra; // Store value of a in temp
*ptra = *ptrb; // Assign value of b to a
*ptrb = temp; // Assign original value of a to b
// Display swapped values
printf("\nAfter swapping:\n");
printf("a = %d\n", a);
printf("b = %d\n", b);
return 0;
}
Comprendiendo la lógica de intercambio
Comprendamos exactamente cómo funciona el intercambio:
temp = *ptra;- El operador*desreferencia el puntero, accediendo al valor en la ubicación de memoria. Esta línea almacena el valor deaentemp.*ptra = *ptrb;- Esto asigna el valor deba la ubicación de memoria dea, cambiando efectivamente el valor dea.*ptrb = temp;- Esto asigna el valor original dea(almacenado entemp) a la ubicación de memoria deb, completando el intercambio.
Después de estas operaciones, las variables a y b han intercambiado valores sin modificarlas directamente; solo modificamos los valores en sus ubicaciones de memoria.
Compilando y probando el programa de intercambio
Ahora que hemos completado nuestro programa, compilémoslo y ejecutémoslo para ver los resultados.
Compilando el programa
Para compilar el programa, usaremos el compilador GNU C (gcc). Abra una terminal en el WebIDE y ejecute el siguiente comando:
cd ~/project
gcc main.c -o swap_program
Este comando compila nuestro archivo main.c y crea un ejecutable llamado swap_program.
Ejecutando el programa
Ahora ejecutemos nuestro programa para ver si intercambia correctamente los valores:
./swap_program
Se le pedirá que ingrese valores para a y b. Por ejemplo, ingresemos:
a= 5b= 10
El programa debe mostrar:
- Los valores originales: a = 5, b = 10
- Las direcciones de memoria de a y b
- Los valores intercambiados: a = 10, b = 5
Comprendiendo la salida
Cuando ejecute el programa, verá varias secciones de salida:
- Valores originales - Muestra los valores antes del intercambio
- Direcciones de memoria - Muestra dónde se almacenan las variables en memoria (serán diferentes cada vez que ejecute el programa)
- Después del intercambio - Muestra los valores después de la operación de intercambio
Intente ejecutar el programa varias veces con diferentes valores de entrada para confirmar que el intercambio funciona de manera consistente.
¿Cómo funciona detrás de escena?
Visualicemos lo que sucede en memoria:
- Inicialmente, si
a = 5yb = 10, cada una tiene su propia ubicación de memoria ptraapunta a la ubicación de memoria deaptrbapunta a la ubicación de memoria deb- Durante el intercambio:
tempobtiene el valor enptra(que es 5)- El valor en
ptrase cambia al valor enptrb(que es 10) - El valor en
ptrbse cambia atemp(que es 5)
- Después del intercambio,
a = 10yb = 5, intercambiando efectivamente sus valores
Esto demuestra el poder de los punteros: nos permiten modificar indirectamente valores manipulando directamente las ubicaciones de memoria.
Resumen
En este laboratorio, aprendimos cómo usar punteros en C para intercambiar los valores de dos variables. Los conceptos clave cubiertos incluyen:
- Punteros: Variables que almacenan las direcciones de memoria de otras variables
- Direcciones de memoria: Ubicaciones únicas en la memoria de la computadora donde se almacenan los datos
- Operaciones con punteros:
- El operador de dirección (
&) para obtener la dirección de memoria de una variable - El operador de desreferenciación (
*) para acceder al valor en una dirección de memoria
- El operador de dirección (
- Algoritmo de intercambio: Utilizar una variable temporal y punteros para intercambiar valores
Esta técnica es un concepto fundamental en la programación en C y demuestra el poder de los punteros para la manipulación de memoria. Puede aplicarse en diversos escenarios de programación, como algoritmos de ordenamiento, operaciones de estructuras de datos e implementaciones de funciones.
Al entender cómo manipular datos a través de direcciones de memoria, has dado un paso importante en el dominio de la programación en C y de los conceptos de memoria de computadora.



