数组是可以通过索引来引用的同类型数据的列表。按照存储空间的获取方式,Delphi支持的数组类型有两种,即静态数组和动态数组。所谓静态数组就是在声明时就已经确定大小的数组类型,而动态数组是指其大小在声明时不能确定的数组,动态数组的大小在使用时确定。

声明静态数组的方式非常简单,只要指明数组长度和数据类型即可,下面就是声明了一个用来存放字符的数组:

var Hello: array[0..5] of char;

容易看出,数组的声明明显包含3个部分,关键词array表明这是一个数组变量,而[x..y]表明数组的索引是从x到y,而of char表明数组的成员是字符类型。按照类似的方法还可以声明其他类型的数组,下面就是这样的示例代码:

var ScoreList: array[1..25] of Integer;

var NameList: array[1..35] of String;

声明了数组后,可以通过索引引用数组的元素(成员)。而使用数组成员的方法与使用这种类型的普通变量类似,下面就是一段使用字符数组的示例代码:

var Hello: array[0..5] of char;

begin
 Hello[0] := ‘H’;
 Hello[1] := ‘e’;
 Hello[2] := ‘l’;
 Hello[3] := ‘l’;
 Hello[4] := ‘o’;
 Hello[5] := Chr(0);
 ShowMessage(Hello);
end;
这里声明了几个数组,它们都是只包含一个索引参数的数组,即一维数组。Delphi支持具有更多索引参数的数组,即多维数组。下面给出一段声明二维数组的示例代码:
var Hello: array[0..5][1..10] of char;
访问二维数组成员的方式与访问一维数组的方式相似,只要按照类似的方式指定两个索引就可以访问二维数组的成员,下面就是使用二维数组的示例代码:
var Hello: array[0..5] of array[0..10] of char;
begin
 Hello[0][0] := ‘H’;
 Hello[0][1] := ‘e’;
 Hello[0][2] := ‘l’;
 Hello[0][3] := ‘l’;
 Hello[0][4] := ‘o’;
 Hello[0][5] := Chr(0);
 ShowMessage(Hello[0]);
end;
按照类似的方法还可以声明具有更高维数的数组,这里不再给出实例。另外,Delphi还支持访问二维数组成员的另外一种方法,下面就是示例代码:
var Hello: array[0..5] of array[0..10] of char;
begin
 Hello[0,0] := ‘H’;
 Hello[0,1] := ‘e’;
 Hello[0,2] := ‘l’;
 Hello[0,3] := ‘l’;
 Hello[0,4] := ‘o’;
 Hello[0,5] := Chr(0);
 ShowMessage(Hello[0]);
end;
前面只是用了静态数组,Delphi还支持动态数组,动态数组在声明时不需指定数组的大小,而在使用时直接指定,下面就是定义动态数组的方法:
var ScoreList: array of Integer;
由于在声明时没有指定动态数组的大小,因此在使用前必须指定动态指定数组的大小,这是通过调用过程SetLength来实现的,下面就是指定动态数组大小的示例:
var
  I: Integer;
  StutCount: Integer;
  ScoreList: array of Integer;
begin
  StutCount := 50;
  SetLength(ScoreList, StutCount);
  // set the score list
  for I := 0 to StutCount - 1 do
  begin
    ScoreList[I] := Random(100);
  end;
  // print the score list
  for I := 0 to StutCount - 1 do
  begin
    ShowMessage('Stut Index: ' + IntToStr(I + 1) +
      #13#10 + 'Socre Value: ' + IntToStr(ScoreList[I]));
  end;
  // to finalize the score list
  SetLength(ScoreList, 0);
end;
这段代码首先使用StutCount变量来初始化数组的大小,然后为所有数组成员随机分配一个在0到100之间的整数,再利用对话框输出这些整数,最后再次使用SetLength将数组的长度设置为0,从而释放数组所占用的空间。另外,后面章节将说明,动态数组实际上就是一个指针。
4. 地址和指针
在学习Delphi程序设计时,地址的概念非常重要,它是理解指针变量的基础。所谓地址就是内存某个存储单元在内存中的位置,而这个位置是相对于内存中第一个存储单元而言的。如果将内存中第一个单元的地址记为0,第二个单元的地址记为1,则第1000个单元的地址就可以记为999。当然,这是一种最简单的记法,在执行应用程序时,实际的地址记法比较复杂,但它们的基本概念完全相同。另外,需要注意的是,只有在程序被加载到内存中开始执行时,程序中的所有变量才在内存中有了实际的对应存储单元,而此时的内存地址才具有实际意义,但编写程序的语言已经将这些底层的复杂问题都隐藏起来了,程序只要使用指针变量来表示指针就可以,不需要关心实际内存的地址。
指针就是用来表示内存地址的变量类型。实际上,绝大多数变量的地址是由程序语言自己来维护的,程序员不需要为这些变量的地址维护变量。指针是程序员为了管理某些与内存密切相关的变量而引入的一种变量类型,它专门用来记录内存中某段存储空间的起始地址的地址值,从而可以方便地找到这段存储空间,进而访问它的内容。
动态数组变量就是一种指针类型变量。数组在内存中是存放在一起的,即数组的多个成员是按照一定的顺序在内存中放在一起的,而动态数组变量就是一个指向这块内存起始地址的指针变量,通过调用这个指针变量,就可以访问数组的内容,前面已经给出了动态数组变量的用法。为了更加深入的说明这种情况,下面给出一个更为明显的例子:
var
  I: Integer;
  StutCount: Integer;
  ScoreList, MyScoreList: array of Integer;
begin
  StutCount := 50;
  SetLength(ScoreList, StutCount);
  // set the score list
  for I := 0 to StutCount - 1 do
  begin
    ScoreList[I] := Random(100);
  end;
  // print the score list
  MyScoreList := ScoreList;
  for I := 0 to StutCount - 1 do
  begin
    ShowMessage('Stut Index: ' + IntToStr(I + 1) +
      #13#10 + 'Socre Value: ' + IntToStr(ScoreList[I]) +
      #13#10 + 'My Socre Value: ' + IntToStr(MyScoreList[I])
      );
  end;
  // to finalize the score list
  SetLength(ScoreList, 0);
end;
正是因为动态数组变量只是一个用来保存内存地址的指针变量,因此上面以黑体显示的语句将使数组MyScoreList与ScoreList指向相同的内存地址,从而就变成实际意义上相同的数组,所以这段代码执行的效果将有力地说明动态数组变量就是指针这个事实。
  注意:但指针本身也是一个变量,它也必须存放在内存中,因此也有指向这个变量的内存的地址,而这个内存的地址是由程序语言自己维护的,不需要由程序员管理。实际上,前面已经说明,在程序运行时,所有变量都必须存放在内存中,都存在实际的地址,而这些地址并不需要程序员去管理的原因就是程序语言已经帮助程序员完成了管理变量地址的任务。

所有简单数据类型(整型、实型、布尔类型等)和大量复杂数据类型都存在相应的指针类型,如果程序需要使用这些变量的指针类型,则可以使用下面的示例代码:

var
  A: Integer;
  PA: PInteger;
begin
  A := 1;
  PA := @A;
  ShowMessage(IntToStr(PA^));
end;
只要将这段代码输入程序中,很容易就可以得到运行结果——即弹出对话框的内容是1。实际上,指针的用法还相当复杂,下面的代码也是正确的:
var
  A: Integer;
  PA: PInteger;
begin
  A := 1;
  PA := @A;
  PA^ := 2;
  ShowMessage(IntToStr(A));
end;
在程序中,根据实际需要,程序员还可以为自己定义的普通或复杂数据类型定义指针数据类型,下面就是定义指针数据类型的示例代码:
type
  PMyRec = ^TMyRec;
  TMyRec = record
    P1: Integer;
    P2: Integer;
    Name: String;
  end;
可以看出,这里定义了一个结构体类型,并定义它的指针类型PMyRec。在后续代码中,程序就可以使用这里定义的数据类型和指针数据类型,下面就是一段使用这种数据类型的示例代码:
var
  rec: TMyRec;
  mrec: PMyRec;
begin
  mrec := @rec;
  mrec^.P1 := 12;
  mrec^.P2 := 2029;
  mrec^.Name := 'mywork';
  ShowMessage(rec.Name + #13#10 + 'ID: ' +
IntToStr(rec.P1) + ', ' + IntToStr(rec.P2));
end;

说明:这里使用了一个结构体数据类型,并已经给出使用结构体数据类型的方法,这里不再详细说明。

原文:http://www.delphitop.com/html/jichu/1895.html

delphi数组之菜鸟篇的更多相关文章

  1. delphi数组如何初始化

    https://wenda.so.com/q/1535561587217078delphi数组如何初始化rosegirl09112级分类:其他被浏览44次2018.07.01检举满意答案 csx330 ...

  2. Delphi之萝莉调教篇

    本文纯属技术交流.如果各位看官想与小生一起探讨萝莉的问题的话...PM我吧 关于Delphi的萝莉调教技术,很久以前就有大牛做过了...其实技术早掌握了只是觉得太无聊~估计大家也都会于是就没有写~既然 ...

  3. Delphi数组

    参考:http://www.cnblogs.com/huangjacky/archive/2009/12/21/1628833.html 数组就是一堆相同特性数据的一个组合,也就是每个元素的类型必须是 ...

  4. delphi 数组类型与数组指针的巧妙利用

    {本例通过存取结构, 慢慢引入了数组类型与指针的一些使用方法; 其中六个小例子的测试内容和结果都是一样的. ---------------------------------------------- ...

  5. 深入理解C语言中的指针与数组之指针篇

    转载于http://blog.csdn.net/hinyunsin/article/details/6662851     前言 其实很早就想要写一篇关于指针和数组的文章,毕竟可以认为这是C语言的根本 ...

  6. delphi 数组类型

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

  7. 深入理解C语言中的指针与数组之指针篇(转载)

    前言 其实很早就想要写一篇关于指针和数组的文章,毕竟可以认为这是C语言的根本所在.相信,任意一家公司如果想要考察一个人对C语言的理解,指针和数组绝对是必考的一部分. 但是之前一方面之前一直在忙各种事情 ...

  8. T4模板之菜菜鸟篇

    一.废话 T4(Text Template Transformation Toolkit)是微软官方在VisualStudio 2008中开始使用的代码生成引擎.在 Visual Studio 中,“ ...

  9. delphi 数组的使用

    delphi中数组就跟string使用类似,数组分为:动态数组和静态数组 还可根据数据的功能分为:数组(一维数组).二维数组.三维数组...静态数组: 固定长度,内容需要定义时添加.动态数组: 故名思 ...

随机推荐

  1. 13.solr学习速成之IK分词器

    IKAnalyzer简介 IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包. IKAnalyzer特性 a. 算法采用“正向迭代最细粒度切分算法”,支持细粒度和最大词长两 ...

  2. 11.solr学习速成之MoreLikeThis

    Solr相似匹配    在网页搜索或电商产品搜索结果页面,很多时候会看到一个相似文档.相似产品或找相似的链接.Solr 使用 MoreLikeThisComponent(MLT)和 MoreLikeT ...

  3. 史上最详细的HashMap红黑树解析

      简介:请允许我当一回标题党.好了,言归正传,本篇主要内容便是介绍HashMap的男二号——TreeNode(男一号还是给Node吧,毕竟是TreeNode的爷爷,而且普通节点一般来说也比TreeN ...

  4. Python实践练习目录

    缘由 做中学才是最好的方法,通过这些项目来加强自己的Python掌握程度. 原则 成体系地学,不搞"题海战术" 通所有不如精一物,精一物方可通所有 走心学,忌浮躁 项目列表 字符串 ...

  5. leetcode526

    public class Solution { //回溯法 //根据回溯的思路,同样,可以对本题的Beautiful排列实现. //比如,当N为5时,使用回溯算法先是得到(1,2,3,4,5)排列,符 ...

  6. Abstract(抽象)

    谈到抽象,就先谈谈面向对象语言的三大特性,也是人们口中常说的封装.继承.多态. 封装:什么是封装,按到我的理解,封装就是把某些类的相关属性和方法封装,对内实现数据影城,对外提供稳定接口. 继承:从字面 ...

  7. ElasticSearch中如何让query should等同于filter should

    bool query must The clause (query) must appear in matching documents. should The clause (query) shou ...

  8. k8s v1.5.8 单节点搭建

    setsid etcd -name etcd -data-dir /var/lib/etcd -listen-client-urls http://0.0.0.0:2379,http://0.0.0. ...

  9. Linux实战教学笔记19:Linux相关网络知识梳理

    第十九节 Linux相关网络知识梳理 标签(空格分隔): Linux实战教学笔记-陈思齐 一,前言 一个运维有时也要和网络打交道,所以具备最基本的网络知识,对一个运维人员来说是必要的.但,对于我们的工 ...

  10. java算法 第七届 蓝桥杯B组(题+答案) 5.抽签

    5.抽签  (代码填空) X星球要派出一个5人组成的观察团前往W星.其中:A国最多可以派出4人.B国最多可以派出2人.C国最多可以派出2人..... 那么最终派往W星的观察团会有多少种国别的不同组合呢 ...