В Object Pascal начиная с версии Delphi 4 введены так называемые динамические массивы. При объявлении таких массивов в программе границы индексов не указываются:
<имя_массива>: array of<тип>;
Например, объявление одномерного, двумерного и трехмерного динамических массивов:
Var
A: array ofInteger;
В: array of array ofChar;
C: array of array of array ofReal;
Распределение памяти и указание границ индексов по каждому измерению динамических массивов осуществляется в ходе выполнения программы путем инициации массива с помощью функции setLength.
Например, в ходе выполнения такого оператора:
SetLength(А,3);
одномерный динамический массив A будет инициирован, т.е. получит память, достаточную для размещения трех целочисленных значений. Нижняя граница индексов по любому измерению динамического массива всегда равна 0, поэтому верхней границей индексов для A станет 2.
Фактически идентификатор динамического массива ссылается на указатель, содержащий адрес первого байта памяти, выделенной для размещения массива. Поэтому для освобождения этой памяти достаточно присвоить идентификатору значение nil (другим способом является использование процедуры Finalize).
При изменении длины уже инициированного динамического массива по какому-либо его измерению сначала резервируется нужная для размещения нового массива память, затем элементы старого массива переносятся в новый, после чего освобождается память, выделенная прежнему массиву.
В многомерных массивах сначала устанавливается длина его первого измерения, затем второго, третьего и т. д. Например:
Var
A: array of array ofInteger;
{Двумерный динамический массив}
Begin
SetLength(A,3);{Устанавливаем длину первого измерения}
{далее задаем длину каждого измерения}
SetLength(A[0],3);
SetLength(A[l],3);
SetLength(A[2],3);
End.
Следует заметить, что в отличие от обычных массивов, динамические массивы могут иметь разную длину по второму и следующим измерениям. В предыдущем примере определен квадратный массив 3х3. Однако можно создать, например, треугольный массив:
SetLength(A,3) ; {далее задаем длину каждого измерения}
SetLength(A[0],3) ;
SetLength(A[l],4) ;
SetLength(A[2],5) ;
В многомерных динамических массивах каждый элемент любого из N-1 измерений (N - количество измерений) представляет собой динамический массив и, следовательно, нуждается в инициации. Вот как, например, можно инициировать вещественный кубический массив 3х3х3: