传统的
Pascal
语言其数组大小是预先确定的,当你用数组结构声明数据类型时,你必须指定
数组元素的个数。
专业程序员也许知道些许动态数组的实现技术,
一般是采用指针,
用手工分配
并释放所需的内存。
Delphi 4
中增加了非常简单的动态数组实现方法,实现过程效仿我前面讲过的动态长字符
串。与长字符串一样,动态数组的内存动态分配并且引用记数,不过动态数组不支持
copy-on-write
技术。这不是个大问题,因为你可以把变量值设置为
nil
释放数组内存。
这样你就可以声明一个不指定元素个数的数组,
并用
SetLength
过程给数组分配一个特定
大小的内存,
SetLength
过程还可以改变数组大小而不影响其内容,除此外还有一些字符串过
程也可用于数组,如
Copy
函数。
以下摘录的代码突出了一点,这就是:定义数组后必须先为它分配内存,然后才能开始使
用:
procedure
TForm1.Button1Click(Sender: TObject);
var
Array1:
array of
Integer;
begin
Array1 [1] := 100;
// error
SetLength (Array1, 100);
Array1 [99] := 100;
// OK
...
end
;
如果你只定义一个数组元素个数,
那么索引总是从
0
开始。
Pascal
中的普通数组既能用不
为零的下标,也能用非整数的下标,但动态数组均不支持这两种下标。
象普通数组一样,你可以
通过
Length
、
High
和
Low
函数了解到动态数组的状况,不过对于动态数组,
Low
函数返回
值总是
0
,
High
函数返回数组大小减
1
,这意味着空的动态数组其函数
High
返回值是
-1
,这
是一个很怪的值,因为它比
Low
的返回值还小。
图
8.1:
例
DynArr
窗体
以上作了简短的介绍,现在举个简例,例名
DynArr
,见图
8.1
。例子实在是很简单,其
实动态数组没有什么特别复杂地方。
我想通过该例说明几个程序员可能犯的错误。
程序中声明了
两个全程数组并在
OnCreate
事件中初始化了第一个数组:
var
Array1, Array2:
array of
Integer;
procedure
TForm1.FormCreate(Sender: TObject);
begin
// allocate
SetLength
(Array1, 100);
end
;