首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

Delphi 動態陣列完整指南:宣告、操作與進階技巧

     編輯:關於SqlServer

Delphi 4 引入動態陣列,彷彿長字串般支援自動記憶體管理與參考計數,大幅簡化陣列操作。本文整理核心語法、記憶體模型、常見陷阱與實用擴充函數。

基本宣告與配置

var
  Arr: array of Integer; // 不指定大小
begin
  SetLength(Arr, 100);   // 配置 100 元素,索引 0..99
  Arr[99] := 100;        // 正常存取
  // Arr[1] := 100;      // 錯誤:未配置前不可存取
end;

特性摘要

  • 索引永遠從 0 開始,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;

常見錯誤與避坑指南

  1. 未配置直接存取:必須先 SetLength。
  2. 別名陷阱:Arr2 := Arr1 非複製,若需獨立副本請用 Copy。
  3. High 回傳 -1:空陣列迴圈 for i := Low to High 不會執行,但 for i := 0 to High 會報錯。
  4. 參數傳遞:無 const/var 修飾時為值傳遞(複製參考),加 const 仍可修改元素內容,僅防止參考被改變。

結語

動態陣列取代傳統鏈結清單成為首選資料結構,因連續記憶體存取速度快、語法簡潔。掌握其記憶體模型與擴充函數,能處理插入、刪除、移動等進階操作,發揮最大效能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved