我所理解的Delphi中的數組類型


數組可以使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個字節的內存,如下:

0016

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 := 0for 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;

兩次消息框顯示界面如下:

0018   0019

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


免責聲明!

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



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