以下内容是从电子书上摘抄出来,方便记忆,在打字时可能会有错误
数组
除标准Pascal数组外,Delphi为特殊环境的使用而定义了几种扩展。动态数组(dynamic array)是在运行时可以改变大小的数组。开放数组(open array)是可以与真实参数一样接受任意大小数组的数组参数。个特殊的开放数组让你以参数形式传递一个不同类型的数组给个例程。如同在ISO标准Pascal中发现的一样,Delphi并不支持构造数组(conformant array),但开发数组提供了相同的功能。
动态数组
动态数组是可以在运行时决定大小的数组。可以在程序运行时让一个动态数组放大或者缩小。声明一个不需要索引类型的动态数组。索引类型总是一个整数,并且总是以零开开头。在运行时可以用SetLength过程来改变一个动态数组的大小。对一个动态数组的指派分配一个对相同数组的引用。与字符串不同,动态数组不使用写复制,帮改变动态数组的一个元素将影响所有对该数组的引用。Delphi使用引用计数来处理动态数组,故当一个数组超出范围时,它的内存将被自动释放。以下显示 了如何声明和使用一个动态数组:
var
I:Integer;
Data: array of Double ; // Dynamic array storing Double values
F: TextFile; // Read data form this file
Value: Double ;
begin
AssignFile('F', 'Stuff.dat') ;
Reset(F) ;
while not Eof(F) do
begin
ReadLn(F, Value) ;
// Inefficient, but simple way to grow a dynamic array. in a real program,
// you should increase the array size in larger chunks, not one element at a time.
SetLength(Data, Length(Data) + 1) ;
Data[High(Data)] := Value ;
end ;
CloseFile(F) ;
end ;
---------------------------------------------------------------------------------------------------------------------------
警告: Delphi检查数组索引来确保它们在范围之内。(假设没有禁止范围检查,参见$R指示字。)
空的动态数组是一个例外。Delphi以一个nil指针表示一个空的动态数组。如果尝试存取一个
空的动态数组,Delphi将废弃nil指针,导致一个存取障碍,而不是一个范围检查错误
---------------------------------------------------------------------------------------------------------------------------
开放数组:
可以对一个函数或过程以一个开放数组来声明一个参数。当调用该例程时,可以传递任意大小的数组(具有相同的基类型)作为参数。该例程应当使用Low和High函数来决定数组边界。(Delphi总是使用零作为下界,Low和High函数可确切地告诉代码的维护者代码在做什么。硬编码的0则没有那么清楚。)如果例程不需要修改数组,则确保以const声明这个参数,或者以var声明,如果例程修改了数组内容的话。
对一个开放数组参数的声明看起来就像对一个动态数组的声明,这可能会令人混淆。当作为一个参数使用时,一个没有索引类型的数组声明是一个开放数组。当用来声明一个局部或者全局变量,一个类里面的一个域,或者一个新类型时,一个没有索引类型的声明则意味着一个动态数组。
可以传递一个动态数组给一个以开放数组声明参数的例程,并且例程可以存取动态数组的元素,但不能改变数组的大小。因为开放数组和动态数组的声明相同,把一个参数声明为一个动态数组的唯一办法是,为动态数组类型声明一个新的类型标识符,如下所示:
procedure CantGrow(var Data: array of ineger);
begin
// Data is an open array, so it cannot change size.
end ;
type
TarrayofInteger = array of integer ; // dynamic array type
procedrue Grow(var Data: TArrayOfInteger);
begin
// Data is a dynamic array, so it can change size.
SetLength(Data, Length(Data) + 1) ;
end ;
可以传递一个动态数组给CantGrow过程,但该数组是以一个开放数组来传递的,而不是作为一个动态数组。该过程可以存取或改变数组元素,但不能改变数组大小。
如果必须从另一种语言调用一个Delphi函数,你可以传递一个开放数组参数作为数组首元素的指针,数组长度减一作为一个不同的32位整数参数。换句话话,数组索引的下限永远是零,第二个参数则是上限。
也可以通过在方括号里包括一系列值来生成一个开放数组参数,这个开放数组表达式只可以被用作开放数组参数,所以你不能把这样一个值分配给一个数组类型变量。不能为一个var开放数组使用这个构造。在不工作时生成一个开放数组是方便的捷径,避免了声明一个const数组的必要:
Ave := ComputeAverage([1,5,7,42,10,-13]);