这是一个实例:编程
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 类型this
对二维数组大小的调整仍然使用SetLength函数,第一个参数是数组名称,第二个参数是最靠近数组名称那个维度的大小,第三个参数是远离数组名称的维度的大小,以此类推。.net
在以上的例子中还有一个特别之处。就是声明了一个大一点范围的二维数组之后,若是对数组从新分配大小,而且这个新的大小是小于原来数组的,那么,大的二维数组与小的二维数组之间相差的部分将会被清除(补充一句,若是这个数组的类型不是基本类型,比方说是这样声明的Can:array of TCanvas 数组类型为TCanvas,那么在这种状况下不会自动调用析构函数,这样就容易形成内存泄漏,因此在编程的时候必定要注意这种使用方法)。即使是立刻将数组大小调整回来甚至更大,都不能使这些数据回来。这个和Delphi中提供的TStringGrid控件不同。对TStringGrid的行列数量进行调整后,原来的数据都不会丢失,除非使用TStringGrid.Rows.Clear;orm
另外,Delphi中还容许设置非矩阵型的动态数组。如下是一个例子blog
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 Nstring
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