先看下面2个例子:
procedure TForm1.Button1Click(Sender: TObject);
var
A1, A2: array[0..3] of Integer; //普通数组
begin
A2 := A1;
A1[0] := 1;
A2[0] := 26;
ShowMessage(IntToStr(A1[0])); //返回1
end;
procedure TForm1.Button2Click(Sender: TObject);
var
A1, A2 : array of Integer; //动态数组
begin
SetLength(A1, 4);
A2 := A1;
A1[0] := 1;
A2[0] := 26;
ShowMessage(IntToStr(A1[0])); //返回26
end;
可见,动态数组的引用操作更类似AnsiString,而不像普通数组。
需要注意的是:
1.动态数组在使用前必须通过SetLength函数分配好内存。
2.动态数组总是从0开始。
3.动态数组会在超出作用域后自动释放内存。如果在作用域内希望释放内存(譬如占用内存较大的场合),只需把动态数组赋值为nil即可。
如果想在动态数组里也想和普通数组一样不通过引用方式直接复制数据的话,需要使用copy函数。
procedure TForm1.Button3Click(Sender: TObject);
var
A1, A2 : array of Integer;
begin
SetLength(A1, 4);
A2 := Copy(A1);
A1[0] := 1;
A2[0] := 26;
ShowMessage(IntToStr(A1[0])); //返回1
end;
通过copy函数可以把A2初始化成和A1数值相同而地址不同的两个独立的数组。
值得一提的是,copy函数还能通过设置参数决定拷贝数据的起始元素和元素个数。
例如:A2 := Copy(A1, 1, 2);
另外:多维动态数组可以通过如下方式创建:
procedure TForm1.Button3Click(Sender: TObject);
var
A1 : array of array of String;
begin
SetLength(A1, 2, 4); //等价于=> A1 : array[0..1, 0..3] of String
A1[0, 3] := 'Data';
......
end;