begin
SetLength(A, 1);
A[0] := 1;
B := A;
B[0] := 2;
end;
A[0]的值是2(若A和B是静态数组,A[0]仍然是1)。
使用索引给动态数组赋值(比如,MyFlexibleArray[2] := 7),不会为数组重新分配内存;编译时,索引边界检查也不会给出提示。
当比较动态数组变量时,是比较它们的引用(这里的值是一个地址),而不是它们的值。所以,下面的代码执行后
var
A, B: array of Integer;
begin
SetLength(A, 1);
SetLength(B, 1);
A[0] := 2;
B[0] := 2;
end;
A = B返回False,但A[0] = B[0]返回True。
要截断一个动态数组,把它传给SetLength或Copy,并把返回的值赋给数组变量(SetLength通常更快)比如,若A是一个动态数组,执行A := SetLength(A, 0, 20),除A的前20个元素外,其它都将被截取掉。一旦一个动态数组被分配内存,你可以把它传给几个标准函数:Length、High和Low。LengthX 。
- 57 - 返回数组
Data types, variables and constants
的元素个数,High返回最大数组的最大索引(也就是Length-1),Low返回0。对于长度为0的数组,High返回-1(得到反常结果High < Low)。
注意:有些函数或过程在声明时,数组参数表示为array of baseType,没有指明索引类型。比如, function CheckStrings(A: array of string): Boolean;
这表明,函数可用于(指定的)基础类型的所有数组,而不管它们的大小和索引,也不管它们是静态分配还是动态分配。请参考Open array parameters。
Multidimensional dynamic arrays(多维动态数组)
要声明多维动态数组,使用复合array of ... 结构,比如,
type TMessageGrid = array of array of string;
var Msgs: TMessageGrid;
声明一个二维字符串数组。要实例化这个数组,应用两个整数参数调用SetLength。比如,若I和J是整数变量,
SetLength(Msgs,I,J);
给它分配内存,Msgs[0,0]表示它的一个元素。
你也能创建不规则的多维动态数组。第一步是调用SetLength,给它传递参数作为前面的(几个)索引。比如,
var Ints: array of array of Integer;
SetLength(Ints,10);
为Ints分配了10行,但没有分配列。接下来,你能每次分配一个列(给它们指定不同的长度),比如, SetLength(Ints[2], 5);
使Ints的第3行有5个元素。此时(即使其它列没有被分配),你能给它的第3行赋值,比如,Ints[2,4] := 6。
下面的例子使用动态数组(IntToStr函数在SysUtils单元声明)来创建一个字符串的三角形矩阵。
var
A : array of array of string;
I, J : Integer;
begin
SetLength(A, 10);
for I := Low(A) to High(A) do
begin
SetLength(A[I], I);
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-23665-39.html
谁能告诉我