今天来研究一下动态数组。直接上代码:
program project1;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Classes
{ you can add units after this };
//打印数组
procedure PrintA(Arr:array of Integer);
var
i:integer;
begin
for i:=0 to Length(Arr)-1 do
begin
write(' a',i,'=',arr[i]);
end;
writeln;
end;
//过程BadEditA是不能修改实参的
procedure BadEditA(Arr:array of Integer);
var
i:integer;
begin
for i:=0 to Length(Arr)-1 do
begin
arr[i]:=88;
end;
end;
//过程A是可以修改实参的
procedure EditA(VAR Arr:array of Integer);
var
i:integer;
begin
for i:=0 to Length(Arr)-1 do //Length函数取动态数组的元素个数
begin
arr[i]:=99;
end;
end;
type
IntArray=array of Integer;
var
dya:array of integer; //动态数组变量定义
dyb:IntArray;
i:integer;
//过程EditB形参A前没有var 但过程内是可以修改实参的
procedure EditB(A:IntArray);
var
i:integer;
begin
for i:=0 to Length(A)-1 do
begin
a[i]:=99;
end;
end ;
begin
SetLength(dya,4); //动态数组使用前要指定元素个数
dya[0]:=1;
dya[1]:=2;
dya[2]:=3;
dya[3]:=4;
PrintA(dya); // 原样输出
BadEditA(dya); // 妄想把动态数组所有值变作88
writeln('after do BadEditA:');
PrintA(dya);// 输出还是原来的样子,没有变化
{上面四行执行后输出结果:
a0=1 a1=2 a2=3 a3=4
after do BadEditA:
a0=1 a1=2 a2=3 a3=4
}
EditA(dya); //想把dya值全部变为99
writeln('after do EditA:');
PrintA(dya); //输出99
{
上面三行执行后:
after do EditA:
a0=99 a1=99 a2=99 a3=99
}
//------
SetLength(dyb,4);
dyb[0]:=1;
dyb[1]:=2;
dyb[2]:=3;
dyb[3]:=4;
EditB(dyb); //也可以改变dyb每一个值为99
writeln('after do EditB:');
for i:=0 to length(dyb)-1 do
begin
write(' dyb',i,'=',dyb[i]);
end;
writeln;
Readln;
end.
总结一下吧。
1 定义数组变量时,没有指定上下边界的数组,即为动态数组,如下:
var
a:array of integer
2 动态数组使用前必须设置元素个数,如下:
Setlength(a,4);
3 动态数组的空间系统自动回收,但也可以手动回收,如下:
Setlength(a,0);
4 要想在过程或函数内更改动态数组内的元素值,有两种方法,
其一是在定义形参前加var ,象过程 EditA(VAR Arr:array of Integer);
其二是定义一种新类型,就象EditB(A:IntArray),其中 IntArray 是自定义的类型:
type
IntArray=array of Integer