Во FreePascal, Delphi добавлена интересная возможность описания массивов без указания размерностей и, соответственно, пределов изменения индексов:
var IntArray: array of integer;
Многомерные динамические массивы описываются именно как массивы массивов. Например, двумерный:
type T3DinArray = array of array of Integer; var A : T3DinArray;
Такие массивы являются динамическими и изначально имеют нулевую длину. Установка размера массива и определение его во время выполнения программы производится так же как и для строк, с помощью функций SetLength и Length, соответственно. Элементы в данном случае нумеруются от нуля.
//В программе сначала задаётся размер по первому измерению (количество столбцов): SetLength(A, 3);//Затем задаётся размер второго измерения для каждого из трёх столбцов, например: SetLength(A[0], 3); SetLength(A[1], 2); SetLength(A[2], 1);
Таким образом создаётся треугольная матрица:
A00 A10 A20
A01A12
A02
Освободить память, занятую массивом, можно используя то же оператор SetLength, указав нулевое количество элементов, либо с помощью команды
<идентификатор> := nil;
Примечание: присвоение значения nilосвобождает память только у динамических массивов Delphi. Для обычных указателей освобождение памяти не производится, что может привести к так называемой "утечке" памяти.
program UsingDynamicArrays1;var А, В: Array of Integer; {Описание двух переменных — динамических массивов целочисленных элементов}begin SetLength(A, 5); {Установка размера массива А (5 элементов) } А[0] := 1; {Присвоение значения 1 элементу массива А с номером 0 }end.
Переменные-динамические массивы являются указателями и операции с ними производятся как с указателями. Например, при присвоении одного массива другому элементы одного массива не копируются во второй, а копируется адрес массива. Соответственно, сравнение двух массивов в логических выражениях типа «равно — не равно» производится сравнением адресов. Пример присвоения одного массива другому:
program UsingDynamicArrays2;var А, В: array of integer; {Описание двух переменных — динамических массивов целочисленных элементов}begin SetLength(A, 5); { Установка размера массива А (5 элементов ) } А[0] := 14; {Присвоение значения 14 нулевому элементу массива А} В := А; {Присвоение массива А массиву В, теперь переменные А и В указывают на один и тот же массив} В[0] := 2; {Присвоение нулевому элементу массива В значения 2, теперь нулевой элемент массива А также имеет значение 2}end.
Отметим существенное отличие в работе со строками и динамическими массивами, имеющими одинаковое внутреннее представление на основе указателей, но разные методы работы. Две разные строки, состоящие из одинакового набора символов, считаются равными, а два разных массива, содержащие одинаковые элементы, не равны.