关于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;
相关文章
|
2月前
|
存储
如何使用指针数组来实现动态二维数组
指针数组可以用来实现动态二维数组。首先,定义一个指向指针的指针变量,并使用 `malloc` 为它分配内存,然后为每个子数组分配内存。通过这种方式,可以灵活地创建和管理不同大小的二维数组。
|
6月前
|
存储 Java 索引
JavaSE——数组(1/2)-数组的定义和访问(静态初始化数组、动态初始化数组、案例练习)
JavaSE——数组(1/2)-数组的定义和访问(静态初始化数组、动态初始化数组、案例练习)
45 7
|
6月前
|
算法 搜索推荐 C++
C++之STL常用算法(遍历、查找、排序、拷贝、替换、算数生成、集合)
C++之STL常用算法(遍历、查找、排序、拷贝、替换、算数生成、集合)
|
7月前
|
Java
<Java SE> 数组详解大全(附带练习题).一维数组、二维数组、数组拷贝、数组遍历...
<Java SE> 数组详解大全(附带练习题).一维数组、二维数组、数组拷贝、数组遍历
58 0
|
存储 机器学习/深度学习 Java
Java数组的定义和使用(一篇带你搞定数组)
Java数组的定义和使用(一篇带你搞定数组)
320 0
|
7月前
|
存储 Java 索引
【Java数组】数组定义 | 初始化赋值 | 数组练习题
【Java数组】数组定义 | 初始化赋值 | 数组练习题
数组的三种声明方式,以及数组倒置
数组的三种声明方式,以及数组倒置
65 0
|
JavaScript 索引
伪数组(类数组)
伪数组(类数组)
81 0
C语言函数可以修改数组的值吗
C语言函数可以修改数组的值吗
|
C语言
【C 语言】数组 ( 数组本质 | 数组长度定义 | 数组初始化 | 编译时初始化 | 显式初始化 - 重置内存 )
【C 语言】数组 ( 数组本质 | 数组长度定义 | 数组初始化 | 编译时初始化 | 显式初始化 - 重置内存 )
276 0
下一篇
DataWorks