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