静,动态数组总结
本文轉自萬一老師的博客
原文出處: http://www.cnblogs.com/del/category/114641.html
靜態數組的定義方法: 
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
//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); 
-------------------------------------------------------------------------------- 
//5. 多維數組: 
var 
? MyArr: array[0..2, 0..2] of Integer; 
begin 
? //使用 
? MyArr[1,2] := 100; 
end; 
-------------------------------------------------------------------------------- 
//6. 根據子界定義數組: 
type 
? TRange = 0..10; 
var 
? MyArr: array[TRange] of Integer; 
-------------------------------------------------------------------------------- 
//7. 根據枚舉定義數組: 
type 
? TEnums = (Enum1,Enum2,Enum3); 
var 
? MyArr: array[TEnums] of?string; 
begin 
? MyArr[Enum1] := '萬一'; 
? ShowMessage(MyArr[Enum1]);? //萬一 
end; 
-------------------------------------------------------------------------------- 
//8. 根據其他類型定義數組: 
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;? //壓縮數組定義, 好像沒有區別? 
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
動態數組的使用: 
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
//例1: 
var 
? StrArr: array?of String;? //動態數組定義時不與維數 
begin 
? SetLength(StrArr,6);? //分配6個元素位置: 0-5 
? StrArr[0] := '萬一';? //動態數組的下界是 0 
? ShowMessage(StrArr[0]);? //分配空間后和靜態數組一樣使用 
? StrArr := nil;??????? //一般沒必要手動釋放, 動態數組離開作用域會自釋放 
end; 
------------------------------------------------------------------------------- 
//給動態數組添加一個元素 
type 
? TOneArray = array?of Integer; 
procedure AddArrayItem(Arr: TOneArray; x: Integer); 
begin 
? SetLength(Arr,Length(Arr)+1); 
? Arr[High(Arr)] := x; 
end; 
-------------------------------------------------------------------------------- 
//例2. 動態數組的引用: 
var 
? Arr1,Arr2: array?of Integer; 
? a: array[0..1] of Integer; 
begin 
? SetLength(Arr1,6); 
? Arr1[5] := 100; 
? Arr2 := Arr1;? //Arr2 引用了 Arr1 
? ShowMessage(IntToStr(Arr2[5]));? //100 
? ShowMessage(IntToStr(Length(Arr2)));? //當然 Arr2 維數也會是 6 
? ShowMessage(IntToStr(SizeOf(Arr1)));? //4, 其實動態數組是個指針 
? ShowMessage(IntToStr(SizeOf(Arr2)));? //4 
? Arr2[5] := 99;?????????????????? //現在它們指向同一個數組, 改變這個就是改變那個 
? ShowMessage(IntToStr(Arr1[5]));? //99 
? Arr1 := nil;???????????????????? //釋放其中一個指針, 數組繼續存在 
? ShowMessage(IntToStr(Arr2[5]));? //99 
end; 
-------------------------------------------------------------------------------- 
//例3. 數組 Copy <1>: 
var 
? Arr1,Arr2: array?of Integer; 
begin 
? SetLength(Arr1,6); 
? Arr1[5] := 100; 
? Arr2 := Copy(Arr1);? //數組 Copy 
? Arr2[5] := 99;? //改變 Arr2 不再影響 Arr1 
? ShowMessage(IntToStr(Arr1[5]-Arr2[5]));? //1 
? SetLength(Arr1,7); 
? ShowMessage(IntToStr(Length(Arr1)));? //7 
? ShowMessage(IntToStr(Length(Arr2)));? //6, 沒有一點牽扯了 
end; 
-------------------------------------------------------------------------------- 
//例4. 數組 Copy <2>: 
var 
? Arr1,Arr2: array?of Integer; 
? i: Integer; 
begin 
? SetLength(Arr1,6); 
? for i := Low(Arr1) to High(Arr1) do? //給每個元素賦值 
??? Arr1[i] := i+1; 
? Arr2 := Copy(Arr1,1,3);? //只 Copy 第2..4個元素 
? ShowMessage(IntToStr(Arr1[1]));? //2, 現在 Arr2[0] 和 Arr1[1] 的值是一樣的 
? ShowMessage(IntToStr(Arr2[0]));? //2 
? ShowMessage(IntToStr(Length(Arr1)));? //6, 維數肯定不一樣了 
? ShowMessage(IntToStr(Length(Arr2)));? //3 
end; 
-------------------------------------------------------------------------------- 
//例5. 動態多維數組: 
var 
? Arr: array?of?array?of Integer;? //定義多維數組 
begin 
? SetLength(Arr,5,5);? //分配空間 
? Arr[0,3] := 100;???? //賦值 
? ShowMessage(IntToStr(Arr[0,3]));? //取值 
end; 
-------------------------------------------------------------------------------- 
//例6. 另類建立: 
var 
? Arr: array?of Integer; 
begin 
? Arr := varArrayCreate([0,3],varInteger); 
? ShowMessage(IntToStr(Length(Arr)));? //4 
? Arr := VarArrayOf([1,2,3,4]); 
? ShowMessage(IntToStr(Arr[0]));? //1 
? {這是給變體數組使用的,可能會有效率問題} 
end; 
-------------------------------------------------------------------------------- 
//動態數組的釋放 
//動態數組一般是不需要手動釋放的, 如果需要... 
var 
? arr: array?of Integer; 
begin 
? {設置動態數組維數} 
? SetLength(arr,10); 
? {釋放方法一} 
? arr := nil; 
? {釋放方法二} 
? SetLength(arr, 0); 
? {釋放方法三} 
? Finalize(arr); 
end; 
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
變體數組: 
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
var 
? Arr: array[0..3] of 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; 
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
數組與枚舉: 
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
type 
? TMyEnum = (Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday); {定義枚舉} 
var 
? weekArr: array[TMyEnum] of?string; {定義數組} 
? myEnum: TMyEnum;?????????????????? {定義枚舉變量} 
begin 
? {數組賦值} 
? weekArr[Monday]??? := '星期一'; 
? weekArr[Tuesday]?? := '星期二'; 
? weekArr[Wednesday] := '星期三'; 
? weekArr[Thursday]? := '星期四'; 
? weekArr[Friday]??? := '星期五'; 
? weekArr[Saturday]? := '星期六'; 
? weekArr[Sunday]??? := '星期天'; 
? {調用數組} 
? ShowMessage(weekArr[Sunday]); {星期天} 
? {遍歷數組} 
? for myEnum := Low(weekArr) to High(weekArr) do 
? begin 
??? ShowMessage(weekArr[myEnum]); {將分別顯示: 星期一 ... 星期天} 
? end; 
end; 
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
數組與子界: 
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
type 
? TABC = 'A'..'G';??????????????? {定義子界} 
var 
? abcArr: array[TABC] of 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} 
? {遍歷數組} 
? for abc := Low(abcArr) to High(abcArr) do 
? begin 
??? ShowMessage(IntToStr(abcArr[abc])); {11 22 33 44 55 66 77} 
? end; 
end; 
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
數組竟然可以這樣定義: 
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
//這是常規思路: 
const 
? arr: array[0..1] of Char = ('A','B'); 
begin 
? ShowMessage(arr);?????????????????? {AB} 
? ShowMessage(IntToStr(Length(arr))); {2} 
end; 
-------------------------------------------------------------------------------- 
//沒想到可以這樣: 
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; 
-------------------------------------------------------------------------------- 
//同理, 這樣也可以: 
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; 
-------------------------------------------------------------------------------- 
//給這種用法來一個必要性的實例: 
const 
? BoolStr: array[Boolean] of?string = ('False', 'True'); 
var 
? b: Boolean; 
begin 
? b := True; 
? ShowMessage(BoolStr[b]); {True} 
? b := not b; 
? ShowMessage(BoolStr[b]); {False} 
end; 
轉載于:https://www.cnblogs.com/w413133157/archive/2010/05/09/1730955.html
總結
 
                            
                        - 上一篇: SQL基础编程
- 下一篇: java gb28181网关_国标GB2
