Guia de rastreamento dinâmico Solaris

Relação entre ponteiro e matriz

Os ponteiros e as matrizes possuem uma relação especial em D, assim como em ANSI-C. Uma matriz é representada por uma variável que é associada ao endereço do seu primeiro local de armazenamento. Um ponteiro também é o endereço de um local de armazenamento com um tipo definido, sendo assim, D permite o uso da notação de índice [ ] de matriz com variáveis de ponteiro e variáveis de matriz. Por exemplo, os dois fragmentos de D seguintes têm significados semelhantes:

p = &a[0];				trace(a[2]);
trace(p[2]);

No fragmento esquerdo, o ponteiro p é atribuído ao endereço do primeiro elemento de matriz em a por meio da aplicação do operador & à expressão a[0]. A expressão p[2] rastreia o valor do terceiro elemento da matriz (índice 2). Como p agora contém o mesmo endereço associado a a, esta expressão possui o mesmo valor que a[2], mostrado no fragmento direito. Uma conseqüência dessa equivalência é que C e D permitem que você acesse qualquer índice de qualquer ponteiro ou matriz. O compilador ou o ambiente de tempo de execução do DTrace não realizam a verificação dos limites da matriz para você. Se você acessar a memória após um valor predefinido de uma matriz, obterá um resultado inesperado ou o DTrace reportará um erro de endereço inválido, como mostrado no exemplo anterior. Como sempre, você não pode danificar o próprio DTrace ou o sistema operacional, mas precisará depurar o seu programa em D.

A diferença entre ponteiros e matrizes é que uma variável de ponteiro se refere a um pedaço separado do armazenamento que contém o endereço do inteiro de algum outro armazenamento. Uma variável nomeia o próprio armazenamento da matriz, não o local de um inteiro que em compensação contém o local da matriz. Esta diferença é ilustrada no diagrama seguinte:

Figura 5–2 Armazenamento de ponteiro e de matriz

O diagrama mostra um ponteiro para uma matriz de cinco objetos.

Esta diferença será manifestada na sintaxe de D, se você tentar atribuir ponteiros e matrizes escalares. Se x e y forem variáveis de ponteiro, a expressão x = y será legal. Ela simplesmente copia o endereço do ponteiro em y para o local de armazenamento nomeado por x. Se x e y forem variáveis de matriz escalar, a expressão x = y não será legal. As matrizes não podem ser atribuídas como um todo em D. Entretanto, uma variável de matriz ou nome de símbolo pode ser usado em qualquer contexto em que um ponteiro seja permitido. Se p for um ponteiro e a for uma matriz, a declaração p = a será permitida; essa declaração equivale a p = &a[0].