Guía de seguimiento dinámico de Solaris

Aritmética de punteros

Ya que los punteros son enteros utilizados como direcciones de otros objetos en memoria, D proporciona un conjunto de características para realizar operaciones aritméticas en punteros. Sin embargo, la aritmética de punteros no es idéntica a la aritmética de enteros. La aritmética de punteros ajusta implícitamente la dirección subyacente multiplicando o dividiendo los operadores por el tamaño del tipo al que el puntero hace referencia. El siguiente fragmento en D ilustra esta propiedad:

int *x;

BEGIN
{
	trace(x);
	trace(x + 1);
	trace(x + 2);
}

Este fragmento crea un puntero de enteros x y, a continuación, rastrea su valor, su valor incrementado en uno y su valor incrementado en dos. Si crea y ejecuta este programa, DTrace informará de los valores de enteros 0, 4 y 8.

Dado que x es un puntero a un entero (4 bytes de tamaño), al aumentar x agrega 4 al valor de puntero subyacente. Esta propiedad resulta útil al emplear punteros para hacer referencia a ubicaciones de almacenamiento consecutivas, como pueden ser matrices. Por ejemplo, si x se asignó a la dirección de una matriz a como la que se muestra en la Figura 5–2, la expresión x + 1 sería equivalente a la expresión &a[1]. De forma similar, la expresión *(x + 1) haría referencia al valor a[1]. La aritmética de punteros es implementada por el compilador en D siempre que un valor de puntero se incremente utilizando los operadores +=, + o ++.

La aritmética de punteros también se aplica cuando un entero se resta de un puntero de la parte izquierda, cuando un puntero se resta de otro puntero o cuando el operador -- se aplica a un puntero. Por ejemplo, el siguiente programa en D rastrearía el resultado 2:

int *x, *y;
int a[5];

BEGIN
{
	x = &a[0];
	y = &a[2];
	trace(y - x);
}