关于Delphi中的静态数组、动态数组、检测数组上下界、copy数组

简介: 关于Delphi中的静态数组、动态数组、检测数组上下界、copy数组

静态数组的定义方法

声明数组需要通过保留字 array 和 of 进行声明:

//1. 标准方法:
var
  MyArr: array[0..10] of Integer;  //定义静态数组
//2. 可以使用非0下标:
var
  MyArr: array[9..10] of Integer;  //不能提倡,这样不容易与系统函数沟通
//3. 根据预定义类型来声明数组:
type
  TMyArr = array[0..10] of Integer;  //先定义一个数组类型
var
  MyArr: TMyArr;  //再定义静态数组
//4. 在非过程区可以直接赋值:
var
  MyArr: array[0..2] of Integer = (11,22,33);
//5. 多维数组:
var
  MyArr: array[0..2, 0..2] of Integer;
begin
  //使用
  MyArr[1,2] := 100;
end;
//6. 根据子界定义数组:
type
  TRange = 0..10;
var
  MyArr: array[TRange] of Integer;

使用类型定义:

//7. 根据枚举定义数组:
type
  TEnums = (Enum1,Enum2,Enum3);
var
  MyArr: array[TEnums] of string;
begin
  MyArr[Enum1] := '十月';
  ShowMessage(MyArr[Enum1]);  //十月
end;
//8. 根据其他类型定义数组:
var
  MyArr: array[Byte] of Char;
begin
  MyArr[255] := #65;
  ShowMessage(MyArr[255]);  //A
end;
//应尽量不使用内建类型,可以新建类型:
type
  TNewByte = Byte;
var
  MyArr: array[TNewByte] of Char;
begin
  MyArr[255] := #65;
  ShowMessage(MyArr[255]);  //A
end;
//也可以使用类型别名:
type
  TChar = type Char;
var
  MyArr: array[TChar] of Byte;
begin
  MyArr['C'] := 255;
  ShowMessage(IntToStr(MyArr['C']));  //255
end;

定义记录类型数组:

//同时定义类型:
type
  MyRec = record
    s: string;
    r: Real;
    b: Byte;
  end;
var
  Arr1: array[0..100] of MyRec;
  Arr2: array[0..100] of record s: string; r: Real; b: Byte; end;  //可以直接这样定义
  Arr3: packed array[0..100] of MyRec;  //压缩数组定义, 好像没有区别

动态数组的使用

动态数组的定义:

在后面定义的时候再写确定的大小。

//例1:
var
  StrArr: array of String;  //动态数组定义时不写维数
begin
  SetLength(StrArr,6);      //分配6个元素位置大小: 0-5
  StrArr[0] := '十七画生';   //动态数组的下界是 0
  ShowMessage(StrArr[0]);   //分配空间后和静态数组一样使用
  StrArr := nil;            //一般没必要手动释放, 动态数组离开作用域会自释放
end;

动态数组的引用:

这里是同一个数组,只不过可以由两个指针指向引用。

var
  Arr1,Arr2: array of Integer;
  a: array[0..1] of Integer;
begin
  SetLength(Arr1,6);
  Arr1[5] := 100;
  Arr2 := Arr1;                          //Arr2 引用了 Arr1
  ShowMessage(IntToStr(Arr2[5]));        //100
  ShowMessage(IntToStr(Length(Arr2)));   //当然 Arr2 维数也会是 6
  ShowMessage(IntToStr(SizeOf(Arr1)));   //4, 其实动态数组是个指针
  ShowMessage(IntToStr(SizeOf(Arr2)));   //4
  Arr2[5] := 99;                   //现在它们指向同一个数组, 改变这个就是改变那个
  ShowMessage(IntToStr(Arr1[5]));  //99
  Arr1 := nil;                     //释放其中一个指针, 数组继续存在(空间还在,指针可以多对一)
  ShowMessage(IntToStr(Arr2[5]));  //99
end;

动态多维数组:

只是简单的添加了一个array。

var
  Arr: array of array of Integer;  //定义多维数组
begin
  SetLength(Arr,5,5);  //分配空间
  Arr[0,3] := 100;     //赋值
  ShowMessage(IntToStr(Arr[0,3]));  //取值
end;

数组copy


全部复制:

这里与Delphi的数组引用有区别,区别实际上在于这里另外开辟了一块空间,里面内容一模一样。

var
  Arr1,Arr2: array of Integer;
begin
  SetLength(Arr1,6);
  Arr1[5] := 100;
  Arr2 := Copy(Arr1);                      //数组 Copy
  Arr2[5] := 99;                           //改变 Arr2 不再影响 Arr1
  ShowMessage(IntToStr(Arr1[5]-Arr2[5]));  //1
  SetLength(Arr1,7);
  ShowMessage(IntToStr(Length(Arr1)));      //7
  ShowMessage(IntToStr(Length(Arr2)));      //6, 没有一点牵扯了
end;

切片范围复制:

这里可以控制复制的范围,可以分块复制,但是不能间隔几个元素复制。

代码如下:

var
  Arr1,Arr2: array of Integer;
  i: Integer;
begin
  SetLength(Arr1,6);
  for i := Low(Arr1) to High(Arr1) do  //给每个元素赋值
    Arr1[i] := i+1;
  Arr2 := Copy(Arr1,1,3);  //只 Copy 第2..4个元素
  ShowMessage(IntToStr(Arr1[1]));  //2, 现在 Arr2[0] 和 Arr1[1] 的值是一样的
  ShowMessage(IntToStr(Arr2[0]));  //2
  ShowMessage(IntToStr(Length(Arr1)));  //6, 维数肯定不一样了
  ShowMessage(IntToStr(Length(Arr2)));  //3
end;

运行结果展示:

检测数组的上、下界

当系统函数low,high的参数是数组变量时,两函数分别返回数组下标的下界和上界。

代码如下:

var
    Myarray: array of integer;
    i : Integer;
begin
    SetLength(MyArray,10);
    for i:=Low(MyArray[i]) to High(MyArray[i]) do
    ……
end;
相关文章
|
前端开发
Delphi绘图功能[2] —— 窗体的绘图属性、圆弧类图形、获取Canvas对象(ClientRect解析)
Delphi绘图功能[2] —— 窗体的绘图属性、圆弧类图形、获取Canvas对象(ClientRect解析)
980 0
Delphi绘图功能[2] —— 窗体的绘图属性、圆弧类图形、获取Canvas对象(ClientRect解析)
|
Windows
CodeSite使用小结
一.要使用Codesite,需要引用csintf单元二.CodeSite的基本方法  (一)AddCheckPoint方法  codesite.AddCheckPoint 加入监测点  (二)AddSeperator方法  codesite.
1076 0
|
SQL Oracle 关系型数据库
数据库sqlserver-----触发器的插入,更新和删除
数据库sqlserver-----触发器的插入,更新和删除
1583 3
|
开发工具
[转载红鱼儿]Delphi实现微信开发(3)如何使用multipart/form-data格式上传文件
开始前,先看下要实现的微信接口,上传多媒体文件,这个接口是用Form表单形式上传的文件。对我来说,对http的Form表单一知半解,还好,查到这个资料,如果你也和我一样,必须看看这篇文章。 在xalion窑主的指导下,我使用了indy自带的TIdMultiPartFormDataStre am类,来提交上传的文件。
2037 0
【乌拉喵.教程】Comport4 CPort for delphi2010串口应用程序
【乌拉喵.教程】Comport4 CPort for delphi2010串口应用程序
566 0
|
算法
常用的简单校验算法:校验和,异或校验,crc校验,LRC校验,补码求和,checksum
常用的简单校验算法:校验和,异或校验,crc校验,LRC校验,补码求和,checksum
3298 1
|
安全 编译器 API
程序与技术分享:C#调用DLL的几种方法
程序与技术分享:C#调用DLL的几种方法
2355 0
|
JavaScript
Uniapp实现时间选择器
Uniapp实现时间选择器
2036 0
|
10月前
|
IDE Linux 开发工具
IntelliJ IDEA最新版安装下载教程及安装教程(附安装包)
本文介绍IDEA的下载与安装教程,包含获取下载地址、安装步骤及激活方法。需注意安装路径为英文目录,运行激活脚本时需管理员权限。按指引操作即可完成激活并使用。
22152 0