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);
}