在有了泛型容器之后我个人使用数组的频率越来越低,但是作为一种应用时间最长、范围最大的容器类型还是有必要掌握的

定义格式

数组类型定义了一组指定类型的元素序列,在方括号中填入下标值就可访问数组中的元素。定义数组时,方括号也用来指定可能的下标值。例如,下面的代码中定义了一个有24个整数的数组:

//声明方式一
typeDayTemperatures = array [1..24] of Integer;//声明方式二
varNames: array [1 .. 3] of string;

在数组定义时,你需要在方括号中填入一个子界类型的值,或者用两个有序类型的常量定义一个新的子界类型,子界类型指定了数组的有效索引。由于子界类型指定了数组下标值的上界和下界,那么下标就不必象C、C++、JAVA和其他语言那样必须从零开始

由于数组下标基于子界类型,因此Delphi 能够对它们进行范围检查。不合法的常量子界类型将导致一个编译时间错误;

如果选上编译器范围检查选项,那么超出范围的下标值将导致一个运行时间错误。

应用实例

使用上述数组定义方法,定义一个DayTemperatures 类型的变量如下:

typeDayTemperatures = array [1..24] of Integer;varDayTemp1: DayTemperatures;procedure AssignTemp;
beginDayTemp1 [1] := 54;DayTemp1 [2] := 52;...DayTemp1 [24] := 66;// compile-time errorDayTemp1 [25] := 67;//这里是错的,因为每个元素都必须是Integer类型DayTemp1 [3] := 1.0;

type是一个很神奇的关键字,在初接触Delphi的时候我以为只能在单元的interface区域声明,其实不然

定长数组

定长数组也就是长度在声明的时候就确定的,后面是不能改变的,而在定长数组里,起始序号不必从0开始,可以自己定,例如

varA : Array[2..3] of Integer;
beginA[2] := 1;//这里会出错,因为定长数组不能再分配SetLength(A,3);
end;

从上面我们可以看到起始序号是2,但是步长是1,是不能改变的。为什么我们看到很多数组的起始序号是0呢?习惯而已。

来看一个特殊用法


typeTColor = (RED, BLUE);
const//用法1Colors2: array [0..1] of String = ('红色', '蓝色');//用法2Colors1: array [TColor] of String = ('红色', '蓝色');
begintryWriteln(Colors1[TColor.RED]);excepton E: Exception doWriteln(E.ClassName, ': ', E.Message);end;Readln;end.

从上面的例子可以看出只要是有序数类型都可以当做数组的序号,但是我们用的时候序号就必须是声明的哪种序数类型,所以上面的代码注释中才会写出两种错误的情况

注意事项:

用法1和用法2的方式需要使用const进行修饰,用法2让我想到了其他语言中的枚举

不定长数组

不定长数组:动态数组,也就是声明的时候没有说长度是多少,在使用之前必须声明,长度是可以再分配的,序号必须从0开始,例子

PS:Delphi 4 的Object Pascal中增加了动态数组,所谓动态数组是在运行时动态分配内存改变数组大小。使用动态数组很容易

varA : Array of Integer;    //定长数组可能的定义是 A :Array[0..10] of Integer
beginSetLength(A, 3);    //数组一共有3个元素A[0] := 1;A[1] := 2;A[2] := 3;//A[3]没有,因为只有3个元素//如果变长长度,直接增加后面的元素SetLength(A, 4);//现在增加了第四个元素,而前三个元素还是那三个A[3] := 4;//如果长度变短了,超出部分就会被去掉SetLength(A, 3);//现在A[3]没有了
end;

有时候,大家这样要先设定长度,在赋值,很麻烦,现在介绍一个一气呵成的招数

typeTA = Array of Integer;
varA : TA;
beginA := TA.Create(1, 2, 3);//此招请勿在Delphi 7上面使用//使用上面的方法之后,A[0] :=1, A[1] := 2, A[2]:=3
end;

一维和多维

前面的所有例子,所讨论的都是一维数组,要想弄一个矩阵(多维数组)怎么办?

varA : Array[0..2, 0..2] of Integer;B : Array[0..2] of Array[0..2] of Integer;
beginA[0, 0] := 1;B[0, 0] := 1;
end;

两种方法都是可以的,下面介绍二维数组中的不定长数组

varB : Array of Array of Integer
begin//设置一个3*3的矩阵SetLength(B, 3, 3);//如果需要实现齿状数组,必须像下面这么做SetLength(B, 3);SetLength(B[0], 1);SetLength(B[1], 2);SetLength(B[2], 3);
end;

序号相关

函数Low()和High()值得信赖,不过我们需要注意的是,他们返回的类型是我们数组的序号的那个类型,并不都是Integer,如前面例子中的THuangJacky

varA : Array of array of string;I, J : Integer;
beginSetLength(A, 10);for I := Low(A) to High(A) dobeginSetLength(A[I], I);for J := Low(A[I]) to High(A[I]) doA[I, J] := IntToStr(I) + ',' + IntToStr(J) + ' ';endend;
end.

使用数组时,你总要用标准函数Low和 High来检测它的边界,Low和 High返回下标的下界和上界。强烈建议使用Low和 High操作数组,特别是在循环中,因为这样能使代码与数组范围无关,如果你改变数组下标的范围声明,Low和 High代码不会受影响;否则,如果代码中有一个数组下标循环体,那么当数组大小改变时你就不得不更新循环体的代码。Low和 High将使你的代码更易于维护、更稳定。

PS:顺便提一下,使用Low和 High不会增加系统运行额外开销。因为在编译时,他们已被转换成常数表达式,而不是实际函数调用。其他简单的系统函数也是这样。

数组长度

Length()函数返回的是Integer类型

varA : Array of Integer;
beginSetLength(A, 2);Length(A);
end.

从上面的那个复制的例子我们可以看出来:定长数组变量就是一个变量,所以可以直接用 := 来赋值,而动态数组变量就是一个指针,如果用了 :=来赋值,两个变量就关联在一起了

varA :Array[0..2] of Integer;B :Array of Integer;
begin//一样,从地址来看这个数组控件在栈上面ShowMessageFmt('A:%8x, A[0]:%8p', [Integer(@A), @A[0]]);SetLength(B, 3);//一样,这个数据空间在堆上面ShowMessageFmt('B:%8p, B[0]:%8p', [B, @B[0]]);
end

Delphi基础教程图文版之数组相关推荐

  1. Delphi基础教程图文版之单元文件

    写完开篇之后考虑很久先写什么,Delphi是以单元(unit)作为它的程序组成,单元文件的后缀名为 .pas 想来想去还是从单元文件开始说起 我们在官方文档可以看到如下的描述 将大型程序划分为可以单独 ...

  2. 零基础 Amazon Web Services (AWS) 入门教程图文版(三)

    原则上WDCP安装好了,就可以直接使用了,FTP.MySQL什么的应有尽有.但是本站Amazon AWS -- 免费的午餐不好吃一文中说到过这个问题,直接用WDCP的MySQL会导致EBS的I/O急剧 ...

  3. 零基础 Amazon Web Services (AWS) 入门教程图文版(四)

    自上一篇之后,5天过去了,这篇文章总算是挤出来了... 其实看不看无所谓啦,都说了WDCP非常适合小白,随便折腾.要是折腾的时候遇到什么问题,欢迎留言探讨~ 五.新建站点 登录WDCP后台,首次登录会 ...

  4. 零基础 Amazon Web Services (AWS) 入门教程图文版(二)

    上一篇讲到,主机正常运转了.但是此时如果直接访问公网IP是打不开网页的,因为主机上没有搭建Web服务器环境,防火墙也没有开放80端口,并且我们没有上传任何网页文件.所以这一篇主要介绍服务器环境的搭建. ...

  5. 零基础 Amazon Web Services (AWS) 入门教程图文版(一)

    现在小站唯一的流量都靠AWS这个关键词了,刚好要用AWS重新建站,所以从头开始记录一遍吧. 所谓零基础,就是你可以没有任何AWS使用经历,仍然能够按照教程操作下去.所谓图文版,就是建议手机用户在没有连 ...

  6. serv-u 自定义html,Serv-U架设教程_Serv-U使用教程图文版

    Serv-U是一款很好用的FTP服务器软件,本文就给大家详细介绍一下<Serv-U架设教>,希望对广大新手有用. Serv-U架设教程_Serv-U使用教程图文版: 1.到文末下载 Ser ...

  7. iOS游戏框架Sprite Kit基础教程——Swift版上册

    iOS游戏框架Sprite Kit基础教程--Swift版上册 试读下载地址:http://pan.baidu.com/s/1qWBdV0C  介绍:本教程是国内唯一的Swift版的Spritekit ...

  8. python基础教程第二版和第三版哪个好-python基础教程 2版和3版哪个适合新手?!...

    python基础教程 2版和3版哪个适合新手? 现在学是学python3. 两者的差异发者本身影响并不大,个别语法细微的差比如python3的print数方式使用,一些常用模块的名称差异,一些机制的差 ...

  9. python基础教程第三版和第二版选哪个-python基础教程 2版和3版哪个适合新手?!...

    python基础教程 2版和3版哪个适合新手? 现在学是学python3. 两者的差异发者本身影响并不大,个别语法细微的差比如python3的print数方式使用,一些常用模块的名称差异,一些机制的差 ...

  10. 计算机入门教程 office2007入门,大学计算机基础教程Office2007版.PPT

    大学计算机基础教程Office2007版.PPT 5.2 创建演示文稿 演示文稿是由一张张独立的幻灯片组成的,把幻灯片放在一起进行逐张播放,就形成了演示文稿.演示文稿可以应用于很多方面,比如演示课件. ...

最新文章

  1. 世界最大的多语言语音数据集现已开源!超40万小时,共23种语言
  2. PHP中的预定义常量
  3. 深度学习方法:受限玻尔兹曼机RBM(三)模型求解,Gibbs sampling
  4. nginx+uWSGI + django部署项目
  5. 5.7-多源复制搭建
  6. 宏定义不是c语言语句 行末不必加分号,模拟C语言试题-02(2).doc
  7. Security+ 学习笔记6 了解漏洞的类型
  8. [翻译].NET委托:一个C#睡前故事 [转]
  9. 【ICEPAK】手把手教你热仿真
  10. Android集成腾讯云通信IM
  11. 周伟焜:杨元庆一定会带领联想成功
  12. citrix vdi 服务器性能要求,如何评估VDI存储要求
  13. 2021CCPC网络预选赛(重赛)
  14. python_you-get下载B站视频详解
  15. Python多态与鸭子类型
  16. 在C++中检测和转换字节序(ENDIAN)
  17. settings.xml详解
  18. 个人信息怎么被贱卖:运营商内鬼不可或缺
  19. 中国驻越南大使馆当地有关部门联系电话
  20. 【MySQL】(四)DBMS

热门文章

  1. 基于P2P终结者的ARP攻击实践(截取数据获取上网账号密码)
  2. dialog下textarea滚动条不显示
  3. TML5期末大作业:美丽家乡网站设计——美丽家乡-含论文(4页) HTML+CSS+JavaScript web前端设计与开发期末作品/期末大作业
  4. Goto是关键?思考
  5. 天翼校园客户端“中毒”,江苏、广东、湖南成重灾区
  6. 飞鱼科技2019笔试题
  7. html参数转义字符,Html转义字符 获得请求参数
  8. android设计常用字体,界面设计必备!全方位科普常用的字体规范
  9. Java代码生成器原理和编写
  10. axure图表元件mac_原型设计元件库-一库(Axure完善的原型设计元件库)- MacV