Delphi數組詳解(整理)


數組是可以通過索引來引用的同類型數據的列表。按照存儲空間的獲取方式,Delphi支持的數組類型有兩種,即靜態數組和動態數組。所謂靜態數組就是在聲明時就已經確定大小的數組類型。

數組的下標一般下界值都為0,不建議使用非0下標。

靜態數組:

 1 標准方法: 
   var MyArr: array[0..10] of Integer; //定義靜態數組
 2 可以使用非0下標: 
   var MyArr: array[9..10] of Integer; //不能提倡,這樣不容易與系統函數溝通
 3 根據預定義類型來聲明數組: 
   type TMyArr = array[0..10] of Integer; //先定義一個數組類型 var MyArr: TMyArr; //再定義靜態數組
 4 在非過程區可以直接賦值: 
   var MyArr: array[0..2] of Integer = (11,22,33);//過程中無法直接賦值操作
 6 多維數組: 
   var MyArr: array[0..2, 0..2] of Integer; begin //使用 MyArr[1,2] := 100; end;
 7 根據子界定義數組: 
   type TRange = 0..10; var MyArr: array[TRange] of Integer;
 8 根據枚舉定義數組: 
   type TEnums = (Enum1,Enum2,Enum3); 
  var MyArr: array[TEnums] of string;
  begin MyArr[Enum1] := '萬一';//Enum1,Enum2,Enum3就相當於普通數組的下標
  ShowMessage(MyArr[Enum1]); //萬一 end;
9 根據其他類型定義數組: 
  var MyArr: array[Byte] of Char; begin MyArr[255] := #65; ShowMessage(MyArr[255]); //A end;
應盡量不使用內建類型,可以新建類型: type TNewByte = Byte; var MyArr: array[TNewByte] of Char; begin MyArr[255] := #65; ShowMessage(MyArr[255]); //A end;

也可以使用類型別名: type TChar = type Char; var MyArr: array[TChar] of Byte; begin MyArr['C'] := 255; ShowMessage(IntToStr(MyArr['C'])); //255 end;

同時定義類型: type MyRec = record s: string; r: Real; b: Byte; end; var Arr1: array[0..100] of MyRec; Arr2: array[0..100] of record s: string; r: Real; b: Byte; end; 可以直接這樣定義: Arr3: packed array[0..100] of MyRec; //壓縮數組定義, 好像沒有區別?
 

動態數組:

動態數組是指其大小在聲明時不能確定的數組,動態數組的大小在使用時確定。分配空間后可以使用 nil 進行釋放空間。一般離開數組作用域系統會自動釋放。

由於動態數組不用提前聲明數組長度,所以一般動態數組下標由 0 開始。

1 常規定義: 
var StrArr: array of String; //動態數組定義時不與維數 begin SetLength(StrArr,6); //分配6個元素位置: 0-5 StrArr[0] := '萬一';
2 指針復制操作與Copy函數:
 var
   Arr1,Arr2: array of Integer;
 begin
   SetLength(Arr1,6);
   Arr1[5] := 100;
   Arr2 := Arr1;//指針賦值操作
   ShowMessage(IntToStr(Length(arr2)));//arr2引用了arr1,所以arr2長度也為6.
   ShowMessage(IntToStr(arr2[5]));//arr2引用了arr1,結果100
     Arr2[5]:= 99;                  //動態數組也是一個指針,改變其中一個數組元素值,另外一個也會改變
     ShowMessage(IntToStr(arr1[5]));//結果99
     arr2 := nil;
     ShowMessage(IntToStr(arr1[5]));//釋放其中一個數組,另外一個沒有影響
     Arr2  := Copy(arr1);//Copy函數是將兩個相同類型的數組進行賦值,此時復制的是所有數組元素
     ShowMessage(IntToStr(arr2[5]));//結果99,這種操作與指針不同,兩個數組之間沒有聯系。
3 動態多維數組:
  var Arr: array of array of Integer; begin SetLength(Arr,5,5); //分配空間 Arr[0,3] := 100; //賦值 ShowMessage(IntToStr(Arr[0,3])); //取值

 

4 變體數組:
 var
    Arr: array[0..3] of Variant;// Variant為變體類型關鍵字
  begin
    Arr[0] := 123;
    Arr[1] := 'wy';
    Arr[2] := True;
    Arr[3] := VarArrayOf([1,'wanyi',1.5]); //變體數組的元素也可以是變體數組
    ShowMessage(Arr[0]); //123,不需要轉換
    ShowMessage(Arr[1]); //wy
    ShowMessage(Arr[2]); //True
    ShowMessage(Arr[3][1]); //wanyi
  end;
 
 5 枚舉數組:
   procedure TForm1.Button1Click(Sender: TObject);
   type
     TMyEnum = (Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday); //定義枚舉}
   var
     weekArr: array[TMyEnum] of string; //定義數組 數組元素是String類型
     myEnum: TMyEnum; //定義枚舉變量}
   begin //數組賦值}
     weekArr[Monday] := '星期一';
     weekArr[Tuesday] := '星期二';
     weekArr[Wednesday] := '星期三';
     weekArr[Thursday] := '星期四';
     weekArr[Friday] := '星期五';
     weekArr[Saturday] := '星期六';
     weekArr[Sunday] := '星期天'; 
     ShowMessage(weekArr[Sunday]); //星期天}
     //遍歷數組 必須定義myEnum: TMyEnum枚舉變量,因為TmyEnum是數組維數,也就是下標 
     for myEnum := Low(weekArr) to High(weekArr) do
     begin
       ShowMessage(weekArr[myEnum]); //將分別顯示: 星期一 ... 星期天}
     end;
   end;

數組定義時,如果唯數是以枚舉開始的話,編譯指令是從Low()..High() 
所以帶有負數值的枚舉用來定義數組常量會出錯. 
Type 
TErrorCode = (ecNOERROR = 0, 
ecDisConnect = -1, 
ecOtherError = -2); 
Const 
ErrorLabels : array [TErrorCode] of String =( 
'無錯誤' , '斷開連接' , '其他錯誤'); 
procedure TForm1.FormCreate(Sender: TObject); 
begin 
Caption := ErrorLabels[ecOtherError]; 
end; 
Caption得到的是:無錯誤,那是因為Low(TErrorCode)=ecOtherError 
High(TErrorCode)就是ecNOERROR 

 

 6 子界數組: 

procedure TForm1.Button1Click(Sender: TObject); type TABC = 'A'..'G'; //定義子界} var abcArr: array[TABC] of Integer; //定義數組 數組元素是 Integer類型 abc: TABC; //定義子界變量} begin //數組賦值} abcArr['A'] := 11; abcArr['B'] := 22; abcArr['C'] := 33; abcArr['D'] := 44; abcArr['E'] := 55; abcArr['F'] := 66; abcArr['G'] := 77; ShowMessage(IntToStr(abcArr['G'])); //77 //遍歷數組 必須定義子界變量abc: TABC 因為 TABC 是數組維數,也就是下標 for abc := Low(abcArr) to High(abcArr) do begin ShowMessage(IntToStr(abcArr[abc])); //11 22 33 44 55 66 77 end; end; end.

 

常規:
procedure TForm1.Button1Click(Sender: TObject);
const
  //因為過程中var無法直接賦值,所以需要const
  arr: array[0..1] of Char = ('A','B');
begin
  ShowMessage(arr); //AB
  ShowMessage(IntToStr(Length(arr))); //2
end;
數組的其他定義方式: procedure TForm1.Button1Click(Sender: TObject);
const arr: array[Boolean] of Char = ('A','B'); begin ShowMessage(arr); //AB ShowMessage(IntToStr(Length(arr))); //2 //訪問元素 ShowMessage(arr[False]); //A ShowMessage(arr[True]); //B //也可以這樣訪問 ShowMessage(arr[Low(arr)]); {A} ShowMessage(arr[High(arr)]); {B} //但不能這樣訪問} // ShowMessage(arr[0]); // ShowMessage(arr[1]); //但可以變通一下} ShowMessage(arr[Boolean(0)]); //A ShowMessage(arr[Boolean(1)]); //B end; procedure TForm1.Button1Click(Sender: TObject); const arr: array[Byte] of Integer = ( 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20, 21,22,23,24,25,26,27,28,29, 30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46, 47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72, 73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98, 99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118, 119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138, 139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158, 159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178, 179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198, 199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218, 219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, 239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256); begin ShowMessage(IntToStr(arr[Low(arr)])); //1 ShowMessage(IntToStr(arr[High(arr)])); //256 ShowMessage(IntToStr(Length(arr))); //256 end; end. procedure TForm1.Button1Click(Sender: TObject); const BoolStr: array[Boolean] of string = ('False', 'True');//過程區直接賦值,所以需要Const 關鍵字 var b: Boolean; begin b := True; ShowMessage(BoolStr[b]); {True} b := not b; ShowMessage(BoolStr[b]); {False} end; end.

 

 動態數組一般是不需要手動釋放的, 如果需要.:
  var arr: array of Integer; begin {設置動態數組維數}     
  SetLength(arr,10); 
  arr := nil;//釋放方法一 
  SetLength(arr, 0);//釋放方法二
  Finalize(arr); //釋放方法三 
  end;

 

注:整理於https://www.cnblogs.com/ahroot/archive/2011/10/28/2227585.html

也可學習https://www.cnblogs.com/huangjacky/archive/2009/12/21/1628833.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM