打印本文 打印本文 关闭窗口 关闭窗口
动态数组介绍----Delphi
作者:武汉SEO闵涛  文章来源:敏韬网  点击数1174  更新时间:2009/4/23 18:39:22  文章录入:mintao  责任编辑:mintao

动态数组介绍----Delphi

 

自从有了动态数组,链表除了在教科书里出现外,已经很少在实际编程中被使用了,事实也是如此,数组的确比传统链表快得多,而且也方便的多。

    从 Delphi4起,开始了内建各种类型的动态数组支持。但是,对我们来说动态数组支持似乎做的不够彻底,因为Delphi竟然连删除、插入、移动连续元素的函数都没有提供,让人使用起来总觉得不够爽!!! J 。作为一名程序员,我们当然要有自己解决问题的能力,下面就让我们简单介绍一下Delphi 下的动态数组。

在Delphi中,数组类型有静态数组(a : array[0..1024] of integer)、动态数组(var a : array of integer)、指针数组(即指向静态数组的指针)和开放数组(仅用于参数传递)。静态数组、指针数组有速度快的好处,动态数组有大小可变的优势,权衡之下就有了折衷的办法,那就是定义的动态数组在必要时转换为指针。

动态数组声明之后,只有下面几个函数可供操作:

1.  设置数组大小,可以任意缩减或增加数组大小

Procedure SetLength(var S ; NewLength : integer);

2.  取出连续元素,复制给另一个数组变量

Function Copy(s;Index,Count : integer) : array ;

3.  取得数组大小及上下限

Function Length(s):integer;

Function High(x):integer;

Function Low(x):integer;

值得注意的是,不加const或var修饰的动态数组会被作为形参传递,而动态数组用const修饰并不意味着你不能修改数组里的元素(不信你可以字自己在程序中试试。还有一点是High函数调用了Length 函数,所以我们在获取数组上限时最好直接用 Length(s) 函数。

动态数组在内存空间中占用4个字节.   动态数组在内存中的分配表如下:

偏移量                                      内容

-8                                   32-bit 引用计数

-4                                   32-bit 数组长度

0..数组长度 * (元素尺寸) - 1   数组元素    元素尺寸=Sizeof(元素类型)

根据上面的分配情况,可以得到如下结果:

如果我们想要清空一个动态数组只需要把“数组长度”和“引用计数”清空即可。”引用上面的一句话就是:“权衡之下就有了折衷的办法,那就是定义的动态数组在必要时转换为指针。”下面是清空动态数组的函数:

procedure DynArraySetZero(var A);

var

  P: PLongint; //占用4个字节,正好符合 32 位内存排列

begin

  P := PLongint(A); // 指向 A 的地址

  Dec(P); //P 地址偏移量是 sizeof(A),指向了数组长度

  P^ := 0; // 长度清空

  Dec(P); // 指向引用计数

  P^ := 0; //计数清空。

end;

上面的函数就这么简单,而且效率也非常高。

下面让我们再来看看怎样删除动态数组中的元素,函数体如下:

{************************************

 A 变量类型  , elSize = SizeOf(A)

index 开始删除的位置索引 ,Count 删除的数量

****************************************}

procedure DynArrayDelete(var A; elSize: Longint; index, Count: Integer);

var

  len, MaxDelete: Integer;

  P : PLongint; //4 个字节的长整形指针

begin

  P := PLongint(A);// 取的 A 的地址

[1] [2]  下一页

打印本文 打印本文 关闭窗口 关闭窗口