Aritmética de Punteros
Parte de la sección Logic & Flow del Journey de C de Coddy — lección 9 de 63.
Has aprendido a acceder a los elementos de un array utilizando la notación de punteros como *(array + i). Ahora descubrirás una técnica aún más potente: aritmética de punteros, que te permite mover punteros a través de la memoria utilizando operaciones simples de incremento y decremento.
Cuando incrementas un puntero con ++ o lo decrementas con --, el puntero no se mueve simplemente un byte. En su lugar, se mueve según el tamaño del tipo de dato al que apunta. Para un puntero de entero, ptr++ se desplaza hacia adelante sizeof(int) bytes, aterrizando exactamente en el siguiente entero en memoria.
int numbers[5] = {10, 20, 30, 40, 50};
int *ptr = numbers; // Apunta al primer elemento (10)
ptr++; // Ahora apunta al segundo elemento (20)
ptr++; // Ahora apunta al tercer elemento (30)Este cálculo automático del tamaño es lo que hace que la aritmética de punteros sea tan potente y conveniente. No necesitas preocuparte por los cálculos de bytes; C se encarga del direccionamiento de memoria por ti basándose en el tipo de datos del puntero.
La aritmética de punteros es particularmente útil para recorrer arreglos en bucles. En lugar de usar índices de arreglos, puedes incrementar un puntero para moverte a través de cada elemento secuencialmente, lo que a menudo resulta en un código más eficiente.
Desafío
FácilEscribe un programa en C que demuestre la aritmética de punteros utilizando operaciones de incremento de punteros para recorrer y procesar un arreglo. Tu programa debe:
- Declarar un arreglo de enteros llamado
datacon 5 elementos e inicializarlo con los valores {12, 24, 36, 48, 60} - Declarar un puntero a un entero llamado
ptre inicializarlo para que apunte al primer elemento del arreglo - Usar un bucle for que se ejecute 5 veces para recorrer todo el arreglo utilizando únicamente aritmética de punteros
- Dentro del bucle:
- Imprimir el valor actual al que apunta
ptrutilizando el operador de desreferencia - Imprimir la dirección de memoria almacenada en
ptrutilizando el especificador de formato%p - Incrementar el puntero usando
ptr++para moverse al siguiente elemento
- Imprimir el valor actual al que apunta
- Después del bucle, restablecer
ptrpara que apunte de nuevo al primer elemento del arreglo - Usar aritmética de punteros para acceder directamente e imprimir el tercer elemento (índice 2) usando
*(ptr + 2) - Usar aritmética de punteros para acceder directamente e imprimir el último elemento (índice 4) usando
*(ptr + 4)
Tu salida debe mostrar los resultados en el siguiente formato:
Value: 12, Address: [address]
Value: 24, Address: [address]
Value: 36, Address: [address]
Value: 48, Address: [address]
Value: 60, Address: [address]
Third element: 36
Last element: 60Este desafío pone a prueba tu comprensión de cómo las operaciones de incremento de punteros se mueven automáticamente según el tamaño del tipo de dato, y cómo puedes usar la aritmética de punteros para acceder a los elementos de un arreglo en desplazamientos específicos desde la posición de un puntero base.
Hoja de referencia
La aritmética de punteros le permite mover punteros a través de la memoria utilizando operaciones de incremento y decremento. Cuando incrementa un puntero, este se mueve según el tamaño del tipo de dato al que apunta, no por un solo byte.
Operaciones básicas de aritmética de punteros:
int numbers[5] = {10, 20, 30, 40, 50};
int *ptr = numbers; // Points to first element (10)
ptr++; // Now points to second element (20)
ptr++; // Now points to third element (30)También puede utilizar la aritmética de punteros para acceder a elementos en desplazamientos (offsets) específicos:
*(ptr + 2) // Access element at offset 2 from current positionLa aritmética de punteros es útil para recorrer arreglos en bucles, lo que a menudo resulta en un código más eficiente que el uso de índices de arreglo.
Pruébalo tú mismo
#include <stdio.h>
int main() {
// TODO: Escribe tu código aquí
// Declarar e inicializar el arreglo 'data' con los valores {12, 24, 36, 48, 60}
// Declarar el puntero 'ptr' e inicializarlo para que apunte al primer elemento
// Usar un bucle for con aritmética de punteros para recorrer el arreglo
// Imprimir cada valor y dirección, luego incrementar el puntero
// Restablecer el puntero y usar aritmética de punteros para acceder a elementos específicos
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