Pues si hablamos de Pascal estandar extendido, como lo es Turbo Pascal, no existen los arrays dinámicos. A pesar de lo que dice Lucia. Ella se refiere a listas dinámicas pero esas no son arrays (ya que no tienen índices).
Ahora bien, si pasamos a Object Pascal (Delphi, FreePascal), entonces sí tenemos arrays dinámicos. Y se declaran así:
var
A: array of <tipo>;
Para luego usarlos con:
begin
SetLength(A, 20); { aquí asignamos 20 posiciones }
...
Todos los arrays dinámicos están indexados por un integer comenzando en la posición cero (en el ejemplo, el índice va de cero a 19). Hay que tener cuidado con las asignaciones entre arrays dinámicos distintos ya que como internamente trabaja con punteros a memoria puede resultar en cosas inesperadas, por ejemplo:
var
A, B: array of integer;
begin
SetLength(A, 20);
A[0]:=1;
B:=A;
B[0]:=2;
end.
Aquí al final del programa A[0] *ahora vale 2*; se debe a que cuando se hace la asignación de un array a otro en realidad lo que internamente sucede es que hay dos punteros que apuntan a la misma región de memoria, o sea, cambiar algo en uno es lo mismo que cambiarlo en los dos al mismo tiempo.
Sin embargo:
var
A, B: array of integer;
begin
SetLength(A, 20);
SetLength(B, 20);
A[0]:=1;
B[0]:=1;
Funciona como en los arrays clásicos hasta que...
if A = B then WriteLn('Son iguales.')
else WriteLn('No son iguales);
Aparentemente ambos arrays son iguales pero no es así pues cuando se usa el identificador del array en realidad se está comparando el puntero a la región de memoria. En el if prescedente la respuesta es siempre false, o sea, siempre va por el else. Cosa que no ocurriría con arrays estáticos.
Por último, hay que tener cuidado con las asignaciones fuera de rango.
En los arrays estáticos algo como esto:
var
A: Array[1..10] of integer;
var
A[11]:=0;
...
Saltará en error ("index out of range"). Pero el mismo caso con arrays dinámicos...
var
A: Array of integer;
var
SetLength(A,10);
A[10]:=0; { recuérdese que los índices de los arrays dinámicos comienzan en cero }
...
No reportará error pero el valor NO será almacenado como parte del array (irá a parar donde sea que caiga el puntero a esa posición en el array que bien puede ser una posición de memoria ocupada por otra variable.
...