Programación C · 3 min read · Nov 15, 2025
Tutorial de Programación en C de Linux Parte 20 - Aritmética de direcciones de punteros

En nuestro tutorial anterior de esta serie continua de Programación en C, discutimos los punteros en un poco de detalle. Ampliando esa discusión, aquí estamos con algunos conceptos adicionales dignos de discusión relacionados con los punteros. Así que sin más preámbulos, comencemos.
Aritmética de direcciones de punteros en C
Primero, centrémonos en la aritmética de direcciones al tratar con punteros. Como discutimos en nuestro tutorial anterior, si tienes un puntero que apunta a un arreglo (digamos el comienzo de él), es muy fácil acceder a los elementos de ese arreglo. Aquí hay un ejemplo:
#include
int main()
{
char arr[]={'a','b','c','d'};
int a[]={1,2,3,4};
char *ptr = arr;
int *p = a;
for(int i=0; i Así que en este código, tenemos dos arreglos - ‘arr’ y ‘a’. Mientras que el primero es un arreglo de caracteres, el segundo es un arreglo de enteros. Luego tenemos dos punteros apuntando a estos arreglos - ‘ptr’ y ‘p’, respectivamente. Luego hay un par de bucles ‘for’ en los que imprimimos la dirección actual a la que apunta el puntero y el valor contenido en esa dirección.
Aquí está la salida de este código en mi máquina:
Puntero de carácter apuntando a 726409312, con valor a
Puntero de carácter apuntando a 726409313, con valor b
Puntero de carácter apuntando a 726409314, con valor c
Puntero de carácter apuntando a 726409315, con valor d
Puntero entero apuntando a 726409296, con valor 1
Puntero entero apuntando a 726409300, con valor 2
Puntero entero apuntando a 726409304, con valor 3
Puntero entero apuntando a 726409308, con valor 4Ahora, lo que es notable aquí son las direcciones impresas en la salida. Para el arreglo de caracteres, agregar ‘1’ al puntero lo incrementó a la siguiente dirección, pero para un arreglo de enteros, agregar ‘1’ al puntero lo hizo saltar 4 direcciones adelante. ¿Por qué es eso?
Bueno, todo depende del tipo de puntero. Un puntero de carácter siempre salta el número de bytes que ocupa un carácter, que generalmente es 1. De manera similar, un puntero a un entero generalmente salta 4 bytes cuando se incrementa en 1. Así que esto debería explicar la diferencia en los saltos de punteros de carácter y entero en la salida anterior.
Continuando con la aritmética de punteros, los punteros pueden ser utilizados en expresiones de comparación en casos selectos. Por ejemplo, si deseas confirmar si un puntero ‘ptr’ apunta a un elemento de un arreglo ‘arr’ (de tamaño ‘size’), entonces puedes hacer la comparación de la siguiente manera:
if((ptr >= arr) && (ptr < (arr + size))) Así que efectivamente, la expresión anterior verifica si la dirección sostenida por el puntero es de uno de sus elementos.
Además, si hay múltiples punteros apuntando a elementos del mismo arreglo, puedes usar los siguientes operadores de comparación ==, !=, <, y >=. De hecho, también puedes realizar la resta de punteros en estos casos. Aquí hay un ejemplo:
#include
int main()
{
char arr[]= "Bienvenido a HowtoForge";
char *ptr = arr;
char *p = arr;
while(*p != '\0')
{
p++;
}
printf("\n La longitud de la cadena es %d", (p - ptr));
return 0;
} Así que en este programa, nos aseguramos de que un puntero apunte al primer elemento del arreglo, mientras que el segundo puntero se incrementa continuamente hasta que apunta al último elemento (que es ‘\0’ en cadenas constantes).
Luego, dado el hecho de que estamos tratando con caracteres aquí (que ocupan un byte cada uno), al restar la dirección apuntada por el primer puntero de la que apunta el segundo puntero, pudimos encontrar el número de caracteres, que si lo ves es la longitud exacta de la cadena.
NOTA: Ten en cuenta que operaciones como suma, multiplicación, división y más son inválidas cuando se trata de punteros. Además, el tipo de operaciones aceptables que hemos enumerado hasta ahora también son válidas solo cuando los punteros son del mismo tipo y apuntan a elementos del mismo arreglo.
Conclusión
Después de discutir conceptos básicos de punteros en el tutorial anterior, ampliamos el concepto de punteros discutiendo la aritmética de direcciones de punteros aquí. Te sugerimos que practiques todo lo que discutimos aquí en tu máquina en forma de programas. Y en caso de que tengas alguna duda o consulta, no dudes en dejar un comentario abajo.
Recibe nuevas publicaciones en tu bandeja de entrada.
No spam. Cancela la suscripción en cualquier momento.