Já que os ponteiros são apenas inteiros usados como endereços de outros objetos na memória, D fornece um conjunto de recursos para realizar aritmética em ponteiros. Entretanto, a aritmética de ponteiro não é idêntica à aritmética de inteiro. A aritmética de ponteiro ajusta implicitamente o endereço subjacente, multiplicando ou dividindo os operandos pelo tamanho do tipo referenciado pelo ponteiro. O fragmento de D seguinte ilustra esta propriedade:
int *x; BEGIN { trace(x); trace(x + 1); trace(x + 2); }
Este fragmento cria um ponteiro de inteiro x e depois rastreia o seu valor, seu valor incrementado por um e seu valor incrementado por dois. Se você criar e executar este programa, o DTrace informará os valores inteiros 0, 4 e 8.
Como x é um ponteiro para um int (de 4 bytes), incrementar x adiciona 4 ao valor de ponteiro subjacente. Esta propriedade é útil quando os ponteiros são usados para fazer referência a locais de armazenamento consecutivos, tais como matrizes. Por exemplo, se x fosse atribuído ao endereço de uma matriz a conforme a mostrada na Figura 5–2, a expressão x + 1 seria equivalente à expressão &a[1]. Similarmente, a expressão *(x + 1) se referiria ao valor a[1]. A aritmética de ponteiro é implementada pelo compilador de D sempre que um valor de ponteiro é incrementado por meio dos operadores +=, + ou ++.
A aritmética de ponteiro também é aplicada quando um inteiro é subtraído de um ponteiro no lado esquerdo, quando um ponteiro é subtraído de outro ponteiro, ou quando o operador -- é aplicado a um ponteiro. Por exemplo, o programa em D seguinte rastrearia o resultado 2:
int *x, *y; int a[5]; BEGIN { x = &a[0]; y = &a[2]; trace(y - x); }