静,动态数组总结
本文轉自萬一老師的博客
原文出處: 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