我所理解的Delphi中的数组类型数组可以使Object Pascal所拥有的任何数据类型,数组是⼀些数值的简单集合。
var
MyArray: array[0..4] of Integer; { 声明⼀个数组包括5个整数数值}
begin
MyArray[0] := -200; { 通过操作符[]就可以访问每个数组元素}
MyArray[1] := -100;
MyArray[2] := 0;
MyArray[3] := 100;
MyArray[4] := 200;
MyArray[0] := MyArray[1] + MyArray[4]; { MyArray[0]为-100}
end;
其MyArray在内存空间的分布,每个整数需要4个字节,因此整个数组将占20个字节的内存,如下:1、多维数组
const
CArray: array[0..4] of Integer = (-20, -100, 0, 100, 200);
{ 数组常量的在声明的同时也要进⾏赋初值}
var
MyArray: array[0..2, 0..4] of Integer; { 两维数组的声明}
UArray: array[10..20] of Integer; { 声明了⼀个下界10到上界20的11个元素的数组}
X: Integer;
begin{ 两种⽅法可以访问两维数组}
X := MyArray[1][1] + MyArray[2][1]; { 1、[X][Y]访问}
X := MyArray[1, 1] + MyArray[2, 1]; { 2、[X, Y]访问}
{ 下⾯的访问超出了数组范围,
将会提⽰“Constant expression violates subrange bounds”错误}
X := MyArray[3, 1] + MyArray[0, 5]; {注意这两个元素超出数组声明的范围}
end;
其中MyArray被声明为⼀个⼆维数组,其在内存中的分布如下:
2、上界与下界
处理数组会经常⽤到上界(Low)和下界(High)函数。如:
var
X, I, Lower, Upper: Integer;
MyArray: array[10..20] of Integer;
begin
{ 这⾥假使已经将MyArray数组进⾏了赋初值}
Lower := Low(MyArray); { Lower的值为 10}
Upper := High(MyArray);{ Upper的值为 20}
X := 0;
for I := Lower to Upper do
begin
X := X + MyArray[I]; { X将累加数组元素值的和}
end;
end;
使⽤上下界函数可以保证存取数组时不越界。
对了,如果换成⼆维数组,上下界函数如何⽤呢
var
Lower1, Upper1: Integer;{ ⽤来存储⼀维的上下界}
Lower2, Upper2: Integer;{ ⽤来存储⼆维的上下界}
MyArray: array[10..20, 1..2] of Integer;
begin
{ 这⾥假使已经将MyArray数组进⾏了赋初值}
Lower1 := Low(MyArray); { Lower的值为 10}
Upper1 := High(MyArray);{ Upper的值为 20}
ShowMessage('第⼀维的下界为 ' + IntToStr(Lower1) +
',上界为 ' + IntToStr(Upper1));
Lower2 := Low(MyArray[Lower1]); {获取MyArray[10]下界}
Upper2 := High(MyArray[Lower1]);{获取MyArray[10]上界}
ShowMessage('第⼆维的下界为 ' + IntToStr(Lower2) +
',上界为 ' + IntToStr(Upper2));
end;
两次消息框显⽰界⾯如下:
3、动态数组(dynamic array)
动态数组是⼀种在运⾏时分配内存的数组,⼀个动态数组可以变⼤,也可以变⼩。
声明⼀个动态数组,只要在声明时不要制定维数,就像这样:
var
SA: array of string; { ⼀维动态数组}
begin
{ 使⽤SetLength进⾏动态数组的空间分配,已有元素可以得到保留}
SetLength(SA, 3);
SA[0] := 'Hello World';
{ 重新分配了动态数组⼤⼩为2个元素}
SetLength(SA, 2);
ShowMessage(SA[0]); {显⽰为'Hello World',说明已有元素得到保留}
end;
⽤同样的⽅法也可以建⽴⼆维动态数组,如下:
var
SA: array of array of string; { ⼆维动态数组}
begin
{ 使⽤SetLength进⾏动态数组的空间分配,已有元素可以得到保留}
SetLength(SA, 20, 20);
SA[0][0] := 'Hello World';
{ 重新分配了动态数组⼤⼩为2个元素}
SetLength(SA, 10, 10);
ShowMessage(SA[0][0]); {显⽰为'Hello World',说明已有元素得到保留}
end;
动态数组建⽴后就可以像普通数组⼀样使⽤。
动态数组通常都是以0为基准的。
动态数组是⽣存期⾃管理的,使⽤完它们后没有必要释放,离开作⽤域后它们会被⾃动释放。当然,如果你想在离开作⽤域前就删除动态数组(⽐如它占⽤太多的内存了,需要释放掉),那就⽤下⾯的语句就可以了。
var
SA: array of string;
begin
SetLength(SA, 20);
SA[0] := 'Hello World';
SA := nil; { 直接把nil赋值给SA就可以了}
二维数组下标怎么理解end;
动态数组的复制问题
var
A1, A2: array of Integer;
begin
SetLength(A1, 4);
A2 := A1;
A1[0] := 1;
A2[0] := 26;
ShowMessage(IntToStr(A1[0])); { 显⽰结果为 26}
{
为什么显⽰26呢?因为A2 := A1这条赋值语句,并没有创建新的数组,仅仅只是将
A1数组的引⽤赋值给了A2,也就是说A2只是A1的⼀个别名⽽已,指向的都是相同东西,
因此对A2所做的任何操作都会影响到A1,如果想要完全复制创建⼀个新的A2数组需要
⽤到Copy函数,如下:
}
A2 := Copy(A1); { A1, A2现在为两个独⽴的数组}
A2[0] := 10;
A1[0] := 26;
ShowMessage(IntToStr(A2[0])); { 现在A2的值为10,说明完全的独⽴了}
A2 := nil; {释放掉A2}
A2 := Copy(A1, 1, 2); { 从元素1开始,复制2个元素到A2}
end;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论