======================================================
注:本文源代码点此下载
======================================================
数组可以使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;
以上都是在delphi7环境中测试通过
======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/