静,动态数组总结

本文转自万一老师的博客

原文出处: http://www.cnblogs.com/del/category/114641.html



静态数组的定义方法:
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

//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;
-------------------------------------------------------------------------------

//
给动态数组添加一个元素
type
  TOneArray = array of Integer;

procedure AddArrayItem(Arr: TOneArray; x: Integer);
begin
  SetLength(Arr,Length(Arr)+1);
  Arr[High(Arr)] := x;
end;
--------------------------------------------------------------------------------

//
2. 动态数组的引用:
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;
--------------------------------------------------------------------------------

//
3. 数组 Copy &lt1>:
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;
--------------------------------------------------------------------------------

//
4. 数组 Copy &lt2>:
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;
--------------------------------------------------------------------------------

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

//
6. 另类建立:
var
  Arr: array of Integer;
begin
  Arr := varArrayCreate([0,3],varInteger);
  ShowMessage(IntToStr(Length(Arr)));  //4

  Arr := VarArrayOf([1,2,3,4]);

  ShowMessage(IntToStr(Arr[0]));  //1
  {
这是给变体数组使用的,可能会有效率问题}
end;
--------------------------------------------------------------------------------

//
动态数组的释放
//
动态数组一般是不需要手动释放的, 如果需要...
var
  arr: array of Integer;
begin
  {
设置动态数组维数}
  SetLength(arr,10);

  {
释放方法一}
  arr := nil;

  {
释放方法二}
  SetLength(arr, 0);

  {
释放方法三}
  Finalize(arr);
end;
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>


变体数组:
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

var
  Arr: array[0..3] of Variant;
begin
  Arr[0] := 123;
  Arr[1] := 'wy';
  Arr[2] := True;
  Arr[3] := VarArrayOf([1,'wanyi',1.5]);  //
变体数组的元素也可以是变体数组

  ShowMessage(Arr[0]);  //123,
不需要转换
  ShowMessage(Arr[1]);  //wy
  ShowMessage(Arr[2]);  //True
  ShowMessage(Arr[3][1]);  //wanyi
end;
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>



数组与枚举:
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
type
  TMyEnum = (Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday); {
定义枚举}
var
  weekArr: array[TMyEnum] of string; {
定义数组}
  myEnum: TMyEnum;                   {
定义枚举变量}
begin
  {
数组赋值}
  weekArr[Monday]    := '
星期一';
  weekArr[Tuesday]   := '
星期二';
  weekArr[Wednesday] := '
星期三';
  weekArr[Thursday]  := '
星期四';
  weekArr[Friday]    := '
星期五';
  weekArr[Saturday]  := '
星期六';
  weekArr[Sunday]    := '
星期天';

  {
调用数组}
  ShowMessage(weekArr[Sunday]); {
星期天}

  {
遍历数组}
  for myEnum := Low(weekArr) to High(weekArr) do
  begin
    ShowMessage(weekArr[myEnum]); {
将分别显示: 星期一 ... 星期天}
  end;
end;
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>



数组与子界:
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
type
  TABC = 'A'..'G';                {
定义子界}
var
  abcArr: array[TABC] of Integer; {
定义数组}
  abc: TABC;                      {
定义子界变量}
begin
  {
数组赋值}
  abcArr['A'] := 11;
  abcArr['B'] := 22;
  abcArr['C'] := 33;
  abcArr['D'] := 44;
  abcArr['E'] := 55;
  abcArr['F'] := 66;
  abcArr['G'] := 77;

  {
调用数组}
  ShowMessage(IntToStr(abcArr['G'])); {77}

  {
遍历数组}
  for abc := Low(abcArr) to High(abcArr) do
  begin
    ShowMessage(IntToStr(abcArr[abc])); {11 22 33 44 55 66 77}
  end;
end;
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>



数组竟然可以这样定义:
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
//
这是常规思路:
const
  arr: array[0..1] of Char = ('A','B');
begin
  ShowMessage(arr);                   {AB}
  ShowMessage(IntToStr(Length(arr))); {2}
end;
--------------------------------------------------------------------------------

//
没想到可以这样:
const
  arr: array[Boolean] of Char = ('A','B');
begin
  ShowMessage(arr);                   {AB}
  ShowMessage(IntToStr(Length(arr))); {2}

  {
访问元素}
  ShowMessage(arr[False]);            {A}
  ShowMessage(arr[True]);             {B}

  {
也可以这样访问}
  ShowMessage(arr[Low(arr)]);         {A}
  ShowMessage(arr[High(arr)]);        {B}

  {
但不能这样访问}
//  ShowMessage(arr[0]);
//  ShowMessage(arr[1]);

  {
但可以变通一下}
  ShowMessage(arr[Boolean(0)]);       {A}
  ShowMessage(arr[Boolean(1)]);       {B}
end;
--------------------------------------------------------------------------------

//
同理, 这样也可以:
const
  arr: array[Byte] of Integer = (
    1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,
    30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,
    56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,
    82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,
    106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,
    126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,
    146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,
    166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,
    186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,
    206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,
    226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,
    246,247,248,249,250,251,252,253,254,255,256);
begin
  ShowMessage(IntToStr(arr[Low(arr)]));  {1}
  ShowMessage(IntToStr(arr[High(arr)])); {256}
  ShowMessage(IntToStr(Length(arr)));    {256}
end;
--------------------------------------------------------------------------------

//
给这种用法来一个必要性的实例:
const
  BoolStr: array[Boolean] of string = ('False', 'True');
var
  b: Boolean;
begin
  b := True;
  ShowMessage(BoolStr[b]); {True}
  b := not b;
  ShowMessage(BoolStr[b]); {False}
end;

转载于:https://www.cnblogs.com/w413133157/archive/2010/05/09/1730955.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/411051.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java tomcat jms_JavaWeb之使用Tomcat、JNDI与ActiveMQ实现JMS消息通信服务

前言之所以使用JNDI 是出于通用性考虑&#xff0c;该例子使用JMS规范提供的通用接口&#xff0c;没有使用具体JMS提供者的接口&#xff0c;这样可以保证我们编写的程序适用于任何一种JMS实现(ActiveMQ、HornetQ等)。什么是JNDI&#xff1a;JNDI(Java Naming and Directory Inte…

[html] HTML5的触屏事件有哪些?

[html] HTML5的触屏事件有哪些&#xff1f; touchstart 触摸开始 touchmove 接触点移动&#xff08;手指不离开屏幕&#xff09; touchend 触摸结束 touchcancel 触摸被取消个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很…

你是第几名:Excel 中 Large 和 Small 的用法

类似于 SQL 语言中的 TOP X, Large 和Small 有2个参数 Large(Array,k) Array 可以为一个单元格区域&#xff0c;k 为第k各最大值&#xff0c;Small 与之对应返回第k个最小值。 注意&#xff1a;单元格区域中的非数字会被忽略掉。 例子如下&#xff1a; 可以类比Rank的用法&…

mac系统下android studio创建手机模拟器

打开android studio&#xff0c;点击右上角的模拟器图标&#xff0c;打开“Android Virtual Device Manager” 窗口&#xff0c;如下图 点击“Create Virtual Device”&#xff0c;在打开的设备定义列表中&#xff0c;选择“Phone -> Nexus 5X”&#xff0c;右边列出了改机型…

java wait 参数_Java sleep()和wait()的区别

一、什么是sleep()?sleep()是Thread类的方法&#xff0c;导致线程暂停执行的时间&#xff0c;给其他线程执行机会&#xff0c;但是依然保持监控状态&#xff0c;过了指定时间会自动恢复执行&#xff0c;调用sleep()方法不会释放锁对象。当调用sleep()方法后&#xff0c;当前线…

[html]html实现页面跳转都有哪些方法?

[html]html实现页面跳转都有哪些方法&#xff1f; 创建A标签跳转location.hrefform submit<meta http-equiv"refresh" content"5;urlother.html">window.history个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c…

如何设置Hyper-V的虚拟机快捷方式

在Windows Server 2008中&#xff0c;提供的Hyper-V功能&#xff0c;可以很方便地在企业环境中部署多个虚拟机&#xff0c;以适应不同的开发需要。一般我们都是通过下面的方式 1. 打开服务器管理器 2.打开Hyper-V管理器&#xff0c;找到有关的虚拟机&#xff0c;然后右键点击“…

使用 keytool 生成安卓应用程序签名

下载 keytool jar包&#xff1b; 解压jar包到固定目录 如&#xff1a; cd /Library/Java/JavaVirtualMachines/ 进入到jar包目录: cd /Library/Java/JavaVirtualMachines/jdk-12.0.1.jdk/Contents/Home 输入keytool&#xff0c;可以查看各种命令。 执行&#xff1a; keytool -…

java 音频对比_java – 比较两个不同的音频文件不起作用

我想比较两个音频文件,例如mp3和wav.我使用musicg来比较指纹.Wave record1 new Wave(music1.toString());Wave record2 new Wave(music2.toString());FingerprintSimilarity Similarityrecord1.getFingerprintSimilarity(record2);System.out.println(Similarity.getSimilari…

[html] 如何在页面引用外部的html页面?

[html] 如何在页面引用外部的html页面&#xff1f; 1.是完整的页面。拥有header&#xff0c;body。使用<iframe> 2.是一个页面片段。使用get请求。或者使用<link ref"import" href"some.html">个人简介 我是歌谣&#xff0c;欢迎和大家一起交…

解析C#中is和as操作符的用法 two

c# 中 is和as 操作符是用来进行强制类型转换的 is : 检查一个对象是否兼容于其他指定的类型,并返回一个Bool值,永远不会抛出异常 objecto newobject(); if(o isLabel) { Label lb (Label)o; Response.Write("类型转换成功"); } else{ …

java跨函数跳转_VS code 函数无法跨文件跳转到定义

现状&#xff1a;本文件函数通过this打点调用的函数&#xff0c;引入绝对路径的文件&#xff0c;调用的函数都可以通过Ctrl 点击 实现跳转到定义处。而如果在 webpack 通过alias 设置了别名&#xff0c;无法跳转成功。解决方案: 新建文件 jsconfig.json&#xff0c;配置如下。…

uname命令

uname命令用于打印当前系统相关信息&#xff08;内核版本号、硬件架构、主机名称和操作系统类型等&#xff09;。 语法 uname(选项) 选项 -a或--all&#xff1a;显示全部的信息&#xff1b; -m或--machine&#xff1a;显示电脑类型&#xff1b; -n或-nodename&#xff1a;显示在…

std::map用法总结

给出了map的基本用法如插入、查找、删除、遍历等等&#xff0c;同时告诉你如何实现双键map&#xff0c;包括 (1) 只有两个键都匹配才命中目标(2) 两个键中任意一个匹配就命中目标 可以扩展到多键(一) 介绍特点&#xff1a;1.map将Key的object和T的Object绑定到一起&#xff0c;…

题库 java_java题库

1.public class T {int squares81;public static void main(String[] args) {new T().go();}void go(){incr(squares);System.out.println(squares);}void incr(int squares){squares10;}返回值为82&#xff0c;没有改变squares的值&#xff0c;不是引用传递不是c2.建个test类 …

Javascript弹出div层

这是一个DIV弹窗效果!将鼠标移动到此 点击这里查看弹出窗口 这是文章“JavaScript弹出窗口DIV层效果代码”的演示页面&#xff0c;点这里查看原文&#xff01; 转载于:https://www.cnblogs.com/xxxxx/archive/2010/05/22/1741707.html

java什么是同步_什么是同步?什么是互斥?

现代操作系统基本都是多任务操作系统&#xff0c;即同时有大量可调度实体在运行。在多任务操作系统中&#xff0c;同时运行的多个任务可能&#xff1a;都需要访问/使用同一种资源 多个任务之间有依赖关系&#xff0c;某个任务的运行依赖于另一个任务 这两种情形是多任务编程中遇…