我所理解的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;

以上都是在delphi7环境中测试通过


======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值