Tutorial de programación en C para Linux Parte 20 – Aritmética de direcciones de punteros

En nuestro anterior tutorial de esta serie de Programación en C en curso, hablamos de los punteros con un poco de detalle. Ampliando esa discusión, aquí estamos con algunos conceptos más dignos de discusión relacionados con los punteros. Así que, sin más preámbulos, empecemos.

Aritmética de direcciones de punteros en C

En primer lugar, vamos a centrarnos en la aritmética de direcciones cuando se trata de punteros. Como ya comentamos en nuestro anterior tutorial, si tienes un puntero que apunta a una matriz (digamos el principio de la misma), es muy fácil acceder a los elementos de esa matriz. Aquí tienes un ejemplo:

#include <stdio.h>

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<sizeof(arr); i++)
{
printf("\n Character pointer pointing to %u, with value %c", ptr, *ptr);
ptr++;
}

for(int i=0; i<(sizeof(a)/sizeof(int)); i++)
{
printf("\n Integer pointer pointing to %u, with value %d", p, *p);
p++;
}

return 0;
}

En este código tenemos dos matrices: ‘arr’ y ‘a’. Mientras la primera es una matriz de caracteres, la segunda es una matriz de enteros. Luego tenemos dos punteros que apuntan a estas matrices: ‘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:

 Character pointer pointing to 726409312, with value a 
Character pointer pointing to 726409313, with value b
Character pointer pointing to 726409314, with value c
Character pointer pointing to 726409315, with value d
Integer pointer pointing to 726409296, with value 1
Integer pointer pointing to 726409300, with value 2
Integer pointer pointing to 726409304, with value 3
Integer pointer pointing to 726409308, with value 4

Ahora bien, lo que cabe destacar aquí son las direcciones impresas en la salida. En el caso de una matriz de caracteres, al añadir «1» al puntero se incrementa hasta la siguiente dirección, pero en el caso de una matriz de enteros, al añadir «1» al puntero se salta 4 direcciones hacia delante. ¿Por qué es así?

Bueno, todo depende del tipo de puntero. Un puntero a un carácter siempre salta el número de bytes que ocupa un carácter, que suele ser 1. Del mismo modo, un puntero a un entero suele saltar 4 bytes cuando se incrementa en 1. Así que esto debería explicar la diferencia en los saltos de los punteros a caracteres y a enteros en la salida anterior.

Siguiendo con la aritmética de punteros, los punteros pueden utilizarse en expresiones de comparación en determinados casos. Por ejemplo, si quieres confirmar si un puntero ‘ptr’ apunta o no a un elemento de una matriz ‘arr’ (de tamaño ‘size’), puedes hacer la comparación de la siguiente manera

if((ptr >= arr) && (ptr < (arr + size))) 

Así que, efectivamente, la expresión anterior comprueba si la dirección que tiene el puntero es o no de uno de sus elementos.

Además, si hay varios punteros que apuntan a elementos de la misma matriz, puedes utilizar los siguientes operadores de comparación ==, !=, < y >=. De hecho, también puedes realizar la resta de punteros en estos casos. Aquí tienes un ejemplo:

#include <stdio.h>

int main()
{
char arr[]= "Welcome to HowtoForge";

char *ptr = arr;
char *p = arr;

while(*p != '\0')
{
p++;
}

printf("\n Length of the string is %d", (p - ptr));

return 0;
}

En este programa, nos aseguramos de que un puntero apunta al primer elemento de la matriz, mientras que el segundo puntero se incrementa continuamente hasta que apunta al último elemento (que es ‘\0’ en las cadenas constantes).

Entonces, dado que aquí se trata de caracteres (que ocupan un byte cada uno), restando la dirección apuntada por el primer puntero de la apuntada por el segundo, podríamos encontrar el número de caracteres, que si ves es la longitud exacta de la cadena.

NOTA: Ten en cuenta que las operaciones como la suma, la multiplicación y la división, entre otras, no son válidas cuando se trata de punteros. Además, el tipo de operaciones aceptables que hemos enumerado hasta ahora sólo son válidas cuando los punteros son del mismo tipo y apuntan a elementos de la misma matriz.

Conclusión

Después de discutir los conceptos básicos de los punteros en el tutorial anterior, hemos ampliado el concepto de los punteros discutiendo aquí la aritmética de las direcciones de los punteros. Te sugerimos que practiques todo lo que hemos tratado 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 a continuación.

También te podría gustar...