Los punteros y matrices tienen una relación especial en D, al igual que la tienen en ANSI-C. Una matriz está representada por una variable que se asocia a la dirección de su primera ubicación de almacenamiento. Un puntero también es la dirección de una ubicación de almacenamiento con un tipo definido, de forma que D permite el uso de la notación de índice [ ] de matriz con las variables de puntero y las variables de matriz. Por ejemplo, los dos siguientes fragmentos en D son equivalentes en significado:
p = &a[0]; trace(a[2]); trace(p[2]);
En el fragmento de la izquierda, el puntero p se asigna a la dirección del primer elemento de matriz en a aplicando el operador & a la expresión a[0]. La expresión p[2] rastrea el valor del tercer elemento de matriz (índice 2). Dado que p ahora contiene la misma dirección asociada a a, esta expresión da lugar al mismo valor que a[2], mostrado en el fragmento de la derecha. Una consecuencia de esta equivalencia es que C y D le permiten acceder a cualquier índice de cualquier puntero o matriz. La comprobación de enlaces de matriz no se realiza por el compilador ni por el entorno de tiempo de ejecución de DTrace. Si accede a la memoria sobrepasando el final de un valor predefinido de la matriz, obtendrá un resultado inesperado o DTrace informará de un error de dirección no válida, como se muestra en el ejemplo anterior. Como siempre, no se puede dañar a DTrace o a su sistema operativo, pero necesitará depurar su programa en D.
La diferencia entre punteros y matrices es que una variable de puntero hace referencia a una parte independiente de almacenamiento que contiene la dirección del entero de algún otro almacenamiento. Una variable de matriz nombra al propio almacenamiento de matriz, no a la ubicación de un entero que, a su vez, contiene la ubicación de la matriz. La diferencia se muestra en el siguiente diagrama:
La diferencia se manifiesta en la sintaxis en D si intenta asignar punteros y matrices escalares. Si x e y son variables de puntero, la expresión x = y es legal; simplemente copia la dirección del puntero en y en la ubicación de almacenamiento nombrada por x. Si x e y son variables de matrices escalares, la expresión x = y no es legal. Es posible que las matrices no se asignen como un todo en D. Sin embargo, una variable de matriz o nombre de símbolo se podrá utilizar en cualquier contexto donde se permita un puntero. Si p es un puntero y a es una matriz, la instrucción p = a está permitida; esta instrucción equivale a la instrucción p = &a[0].