Guia de rastreamento dinâmico Solaris

Aritmética de ponteiro

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