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

 网上的关于Delphi的文章很少,我在学习了Delphi的过程中将自己的一些思考总结下来,方便后面学习Delphi或者相关内容时方便学习使用Delphi。


目录

          静态数组的定义方法

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

使用类型定义:

定义记录类型数组:

 动态数组的使用

动态数组的定义:

动态数组的引用:

动态多维数组:

数组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;
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

幸福西西弗斯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值