這是一個實例:
procedure TMainForm.Button1Click(Sender: TObject);
var
arr:array of array of string;
begin
setlength(arr,2,3);
arr[1,2]:='this is a test';
setlength(arr,0,0);
setlength(arr,4,5);
showmessage(arr[1,2]);
end;
聲明一個二維數組的方法是用 array of array of 類型 這很貼近人們的思維方式。同理可推出三維數組的聲明方法為 array of array of array of 類型
對二維數組大小的調整仍然使用SetLength函數,第一個參數是數組名稱,第二個參數是最靠近數組名稱那個維度的大小,第三個參數是遠離數組名稱的維度的大小,以此類推。
在以上的例子中還有一個特別之處。就是聲明了一個大一點范圍的二維數組以后,如果對數組重新分配大小,並且這個新的大小是小於原來數組的,那么,大的二維數組與小的二維數組之間相差的部分將會被清除(補充一句,如果這個數組的類型不是基本類型,比方說是這樣聲明的Can:array of TCanvas 數組類型為TCanvas,那么在這種情況下不會自動調用析構函數,這樣就容易造成內存泄漏,所以在編程的時候一定要注意這種使用方法)。即便是馬上將數組大小調整回來甚至更大,都不能使這些數據回來。這個和Delphi中提供的TStringGrid控件不一樣。對TStringGrid的行列數量進行調整后,原來的數據都不會丟失,除非使用TStringGrid.Rows.Clear;
另外,Delphi中還允許設置非矩陣型的動態數組。以下是一個例子
procedure TMainForm.Button1Click(Sender: TObject);
var
arr:array of array of string;
begin
setlength(arr,10);
setlength(arr[2],5);
arr[2,4]:='this is a test';
showmessage(arr[2,4]);
showmessage(arr[3,1]);
end;
這里面聲明了一個二維字符串數組arr,首先對這個數組的第一維度(按照習慣,稱之為“列”)進行設置,大小為10個。然后將這個數組的第三列(下標是2,但實際卻是第三列)的行數進行單獨設置,大小為5個。這樣就構成了下圖這樣的矩陣
N N X N N N N N N N
N N X N N N N N N N
N N X N N N N N N N
N N X N N N N N N N
N N * N N N N N N N
(“X” 代表可用 “N”代表不可用 “*”代表arr[2,4]元素)
然后對arr[2,4]進行賦值“this is a test”。先要求顯示arr[2,4]的值,OK,完全沒有問題,但到了arr[3,1]的時候卻報錯,原因就是這個二維數組不是矩陣形式,除了第三列,其他地方都是不存在的,盡管已經聲明了。
————————————————
版權聲明:本文為CSDN博主「Jack_Chai」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/chaijunkun/article/details/5373597