Delphi 4 引入動態陣列,彷彿長字串般支援自動記憶體管理與參考計數,大幅簡化陣列操作。本文整理核心語法、記憶體模型、常見陷阱與實用擴充函數。
var
Arr: array of Integer; // 不指定大小
begin
SetLength(Arr, 100); // 配置 100 元素,索引 0..99
Arr[99] := 100; // 正常存取
// Arr[1] := 100; // 錯誤:未配置前不可存取
end;
Low(Arr) 恆為 0,High(Arr) = Length(Arr) - 1。High = -1,需注意迴圈邊界。Arr2 := Arr1 僅複製參考(別名),修改其中一個會影響另一個。Copy(Arr, Index, Count) 回傳新陣列,實現深層複製。nil 或 SetLength(Arr, 0) 釋放記憶體。動態陣列變數佔 4 位元組(指標),指向資料區塊:
偏移 -8 : 32-bit 參考計數 偏移 -4 : 32-bit 陣列長度 偏移 0 : 元素資料 (Length * SizeOf(Element))
procedure DynArraySetZero(var A);
var P: PLongint;
begin
P := PLongint(A);
Dec(P); P^ := 0; // 長度歸零
Dec(P); P^ := 0; // 參考計數歸零
end;
procedure DynArrayDelete(var A; ElSize: Longint; Index, Count: Integer);
var Len, MaxDel: Integer; P: PLongint;
begin
P := PLongint(A); if P = nil then Exit;
Len := PLongint(PChar(P) - 4)^; // 取得長度
if Index >= Len then Exit;
MaxDel := Len - Index;
Count := Min(Count, MaxDel);
if Count = 0 then Exit;
Dec(Len, Count);
MoveMemory(PChar(P) + Index * ElSize,
PChar(P) + (Index + Count) * ElSize,
(Len - Index) * ElSize);
Dec(P); Dec(P); // 移至參考計數
ReallocMem(P, Len * ElSize + 8);
Inc(P); P^ := Len; // 更新長度
Inc(P); PLongint(A) := P;
end;
SetLength。Arr2 := Arr1 非複製,若需獨立副本請用 Copy。for i := Low to High 不會執行,但 for i := 0 to High 會報錯。const/var 修飾時為值傳遞(複製參考),加 const 仍可修改元素內容,僅防止參考被改變。動態陣列取代傳統鏈結清單成為首選資料結構,因連續記憶體存取速度快、語法簡潔。掌握其記憶體模型與擴充函數,能處理插入、刪除、移動等進階操作,發揮最大效能。