當過程或函數使用數組參數時,不能在聲明參數時包含索引說明符。也就是說,聲明定義下面函數將產生編譯錯誤。
procedure Sort(A:array[1..10] of Integer);//語法錯誤
但使用下面這種方法是有效的。但在大多數情況下,開放數組參數是更好的辦法。
type TDigits=array[1..10]of Integer;
procedure Sort(A:TDigits);
開放數組參數允許傳遞不同長度的數組到一個過程或函數。要定義一個使用開放數組參數的方法,在聲明參數時使用“array of type”。
function Find(A: array of Char):Integer;
雖然定義開放數組參數的語法和定義動態數組相似,但它們的意義不同。上面的例子創建了一個函數,它可以接收由字符構成的任何數組,包括靜態和動態數組。對於僅接收動態數組的參數,你需要指定一個類型標識符:
type TDynamicCharArray = array of Char;
function Find(A:TDynamicCharArray): Integer;
開放數組參數遵循以下規則:【注1】
(1)數組元素的下標總是從0開始,第一個是0,第二個是1,依此類推。
不論實參(實際數組)下標從什麼開始,Low(arr)返回0,High(arr)返回Length-1。
//測試代碼
procedure ListAllIntegers(const arr: array of Integer);
var I: Integer;
begin
for I := Low(arr) to High(arr) do
WriteLn(arr[I], '的索引是', I);
end;
//測試數據
var
arr: array[7..9] of Integer;
begin
arr[7] := 7;
arr[8] := 8;
arr[9] := 9;
ListAllIntegers(arr);
end.
結果:
(2)只能訪問數組中的元素。對整個開放數組參數(即形參變量)賦值是不允許的。因為開放數組可能傳遞的是靜態數組,而靜態數組不能重新分配內存。
(3)可以將開放數組參數傳遞給其他同類型的開放數組形參或無類型參數(untyped parameters【注2】)。
They can be passed to other procedures and functions only as open array parameters or untyped var parameters. They can not be passed toSetLength.
//無類型參數
procedure func1(var arr);
begin
WriteLn(Integer(arr));
end;
//開放數組參數
procedure func2(arr:array of Integer);
begin
WriteLn(arr[0]);
end;
//測試調用該函數
procedure func3(arr:array of Integer);
begin
WriteLn('無類型參數調用結果:');
func1(arr);
WriteLn('開放數組參數調用結果:');
func2(arr);
end;
結果:
(4)可以將一個變量傳遞給相同類型的開放數組,它將自動被當成長度為1的數組。
(5)當把一個數組作為開放數組的值參數傳遞時,編譯器將在棧中創建數組副本。因此在傳遞大的數組時小心棧溢出,盡量使用const或var修飾開放數組參數。