數組可以使Object Pascal所擁有的任何數據類型,數組是一些數值的簡單集合。
var MyArray: array[0..4] of Integer; { 聲明一個數組包括5個整數數值} begin MyArray[0] := -200; { 通過操作符[]就可以訪問每個數組元素} MyArray[1] := -100; MyArray[2] := 0; MyArray[3] := 100; MyArray[4] := 200; MyArray[0] := MyArray[1] + MyArray[4]; { MyArray[0]為-100} end;
其MyArray在內存空間的分布,每個整數需要4個字節,因此整個數組將占20個字節的內存,如下:
1、多維數組
const CArray: array[0..4] of Integer = (-20, -100, 0, 100, 200); { 數組常量的在聲明的同時也要進行賦初值} var MyArray: array[0..2, 0..4] of Integer; { 兩維數組的聲明} UArray: array[10..20] of Integer; { 聲明了一個下界10到上界20的11個元素的數組} X: Integer; begin { 兩種方法可以訪問兩維數組} X := MyArray[1][1] + MyArray[2][1]; { 1、[X][Y]訪問} X := MyArray[1, 1] + MyArray[2, 1]; { 2、[X, Y]訪問} { 下面的訪問超出了數組范圍, 將會提示“Constant expression violates subrange bounds”錯誤} X := MyArray[3, 1] + MyArray[0, 5]; {注意這兩個元素超出數組聲明的范圍} end;
其中MyArray被聲明為一個二維數組,其在內存中的分布如下:
2、上界與下界
處理數組會經常用到上界(Low)和下界(High)函數。如:
var X, I, Lower, Upper: Integer; MyArray: array[10..20] of Integer; begin { 這里假使已經將MyArray數組進行了賦初值} Lower := Low(MyArray); { Lower的值為 10} Upper := High(MyArray);{ Upper的值為 20} X := 0; for I := Lower to Upper do begin X := X + MyArray[I]; { X將累加數組元素值的和} end; end;
使用上下界函數可以保證存取數組時不越界。
對了,如果換成二維數組,上下界函數如何用呢???
var Lower1, Upper1: Integer;{ 用來存儲一維的上下界} Lower2, Upper2: Integer;{ 用來存儲二維的上下界} MyArray: array[10..20, 1..2] of Integer; begin { 這里假使已經將MyArray數組進行了賦初值} Lower1 := Low(MyArray); { Lower的值為 10} Upper1 := High(MyArray);{ Upper的值為 20} ShowMessage('第一維的下界為 ' + IntToStr(Lower1) + ',上界為 ' + IntToStr(Upper1)); Lower2 := Low(MyArray[Lower1]); {獲取MyArray[10]下界} Upper2 := High(MyArray[Lower1]);{獲取MyArray[10]上界} ShowMessage('第二維的下界為 ' + IntToStr(Lower2) + ',上界為 ' + IntToStr(Upper2)); end;
兩次消息框顯示界面如下:
3、動態數組(dynamic array)
動態數組是一種在運行時分配內存的數組,一個動態數組可以變大,也可以變小。
聲明一個動態數組,只要在聲明時不要制定維數,就像這樣:
var SA: array of string; { 一維動態數組} begin { 使用SetLength進行動態數組的空間分配,已有元素可以得到保留} SetLength(SA, 3); SA[0] := 'Hello World'; { 重新分配了動態數組大小為2個元素} SetLength(SA, 2); ShowMessage(SA[0]); {顯示為'Hello World',說明已有元素得到保留} end;
用同樣的方法也可以建立二維動態數組,如下:
var SA: array of array of string; { 二維動態數組} begin { 使用SetLength進行動態數組的空間分配,已有元素可以得到保留} SetLength(SA, 20, 20); SA[0][0] := 'Hello World'; { 重新分配了動態數組大小為2個元素} SetLength(SA, 10, 10); ShowMessage(SA[0][0]); {顯示為'Hello World',說明已有元素得到保留} end;
動態數組建立后就可以像普通數組一樣使用。
動態數組通常都是以0為基准的。
動態數組是生存期自管理的,使用完它們后沒有必要釋放,離開作用域后它們會被自動釋放。當然,如果你想在離開作用域前就刪除動態數組(比如它占用太多的內存了,需要釋放掉),那就用下面的語句就可以了。
var SA: array of string; begin SetLength(SA, 20); SA[0] := 'Hello World'; SA := nil; { 直接把nil賦值給SA就可以了} end;
動態數組的復制問題
var A1, A2: array of Integer; begin SetLength(A1, 4); A2 := A1; A1[0] := 1; A2[0] := 26; ShowMessage(IntToStr(A1[0])); { 顯示結果為 26} { 為什么顯示26呢?因為A2 := A1這條賦值語句,並沒有創建新的數組,僅僅只是將 A1數組的引用賦值給了A2,也就是說A2只是A1的一個別名而已,指向的都是相同東西, 因此對A2所做的任何操作都會影響到A1,如果想要完全復制創建一個新的A2數組需要 用到Copy函數,如下: } A2 := Copy(A1); { A1, A2現在為兩個獨立的數組} A2[0] := 10; A1[0] := 26; ShowMessage(IntToStr(A2[0])); { 現在A2的值為10,說明完全的獨立了} A2 := nil; {釋放掉A2} A2 := Copy(A1, 1, 2); { 從元素1開始,復制2個元素到A2} end;
http://www.cnblogs.com/pchmonster/archive/2011/12/15/2288738.html