Отсчет элементов динамического массива всегда начинается с нуля. При работе с многомерным динамическим массивом, например следующего вида:
var MyArray : Array of Array of Char;
все размерности массива можно задавать одновременно:
SetLength(MyArray, 10, 5); //распределили память для 2-мерного массива
или последовательно для каждого индекса. Массивы с переменной длиной по разным индексам называют динамическими разреженными массивами.
SetLength(MyArray,3); //массив состоит из 3 строк
SetLength(MyArray[0],3); //в нулевой строке 3 элемента
SetLength(MyArray[1],2); //в первой строке 2 элемента
SetLength(MyArray[2],10); //во второй строке 10 элементов
Раньше для освобождения памяти, выделенной для динамического массива, применяли процедуру Finalize().
Finalize(MyArray);
Теперь это делать необязательно, т. к. при завершении работы с массивом Delphi самостоятельно освободит занятые ресурсы.
При работе с однотипными динамическими массивами наиболее эффективным способом копирования данных из одного массива в другой считается вызов функции Copy(). Метод умеет копировать как массив целиком, так и некоторые его элементы.
var Arr1, Arr2 : array : of integer; SetLength(Arr1,4)
for i:=0 to High(Arr1) do Arr1[i]:=i; //заполнение массива данными Arr2:=Copy(Arr1); //полное копирование
Arr2:=Copy(Arr1, 0, 2); //копирование части массива
Заметьте, что мы не задаем длину второго массива, она будет определена автоматически с вызовом метода Copy(). Кроме того, динамические массивы понимают механизм ссылок.
var Arr1, Arr2 : array : of integer; Arr2:=Arr1;
Обратите внимание: при простом копировании массивы хранят данные в разных областях ОЗУ, а при использовании оператора присваивания оба массива будут ссылаться на одну и ту же область памяти. И если теперь нулевому элементу первого массива присвоить значение 10, то это же значение окажется в нулевой ячейке второго массива.
Массив можно передавать и как параметр метода, правда, с некоторыми ограничениями. Если параметр представляет собой статический массив, то массив предварительно должен быть типизирован.
type TMyArray = Array [0..5] of Byte;
procedure Proc1(Arr : TMyArray);
var i : integer;
begin
for i:=Low(Arr) to High(Arr) do Arr[i]:=0;
end;
Объявление процедуры с аргументом в виде динамического массива несколько проще:
procedure Proc1(Arr : Array of Byte);