delphi数组之菜鸟篇
数组是可以通过索引来引用的同类型数据的列表。按照存储空间的获取方式,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数组之菜鸟篇的更多相关文章
- delphi数组如何初始化
https://wenda.so.com/q/1535561587217078delphi数组如何初始化rosegirl09112级分类:其他被浏览44次2018.07.01检举满意答案 csx330 ...
- Delphi之萝莉调教篇
本文纯属技术交流.如果各位看官想与小生一起探讨萝莉的问题的话...PM我吧 关于Delphi的萝莉调教技术,很久以前就有大牛做过了...其实技术早掌握了只是觉得太无聊~估计大家也都会于是就没有写~既然 ...
- Delphi数组
参考:http://www.cnblogs.com/huangjacky/archive/2009/12/21/1628833.html 数组就是一堆相同特性数据的一个组合,也就是每个元素的类型必须是 ...
- delphi 数组类型与数组指针的巧妙利用
{本例通过存取结构, 慢慢引入了数组类型与指针的一些使用方法; 其中六个小例子的测试内容和结果都是一样的. ---------------------------------------------- ...
- 深入理解C语言中的指针与数组之指针篇
转载于http://blog.csdn.net/hinyunsin/article/details/6662851 前言 其实很早就想要写一篇关于指针和数组的文章,毕竟可以认为这是C语言的根本 ...
- delphi 数组类型
数组类型 数组类型定义了一组指定类型的元素序列,在方括号中填入下标值就可访问数组中的元素.定义数组时,方括号也用来指定可能的下标值.例如,下面的代码中定义了一个有 24 个整数的数组:type ...
- 深入理解C语言中的指针与数组之指针篇(转载)
前言 其实很早就想要写一篇关于指针和数组的文章,毕竟可以认为这是C语言的根本所在.相信,任意一家公司如果想要考察一个人对C语言的理解,指针和数组绝对是必考的一部分. 但是之前一方面之前一直在忙各种事情 ...
- T4模板之菜菜鸟篇
一.废话 T4(Text Template Transformation Toolkit)是微软官方在VisualStudio 2008中开始使用的代码生成引擎.在 Visual Studio 中,“ ...
- delphi 数组的使用
delphi中数组就跟string使用类似,数组分为:动态数组和静态数组 还可根据数据的功能分为:数组(一维数组).二维数组.三维数组...静态数组: 固定长度,内容需要定义时添加.动态数组: 故名思 ...
随机推荐
- std::thread函数传参拷贝次数
c++11的thread库大大方便了开发,但是目前网络上少有深入分析的资料和使用例程.特别是在线程函数传参这一块,一般止步于使用std::ref传引用. 这次写服务器遇到个BUG,线程函数参数是智能指 ...
- 使用CCNode作为容器容易踩的坑
Cocos2dx中CCNode经常作为一个父容器,里面装一些UI控件,最后组成一个复杂的自定义的UI控件,但是在使用别人的自定义控件和自己写自定义问题的时候会踩一些坑. 首先拿到一个自定义的UI控件一 ...
- TCP报文大小
链路层(二层)MTU最大传输单元:1500KByte.每个以太网帧64bytes-1518bytes,减去帧头(DMAC目的MAC地址48bit=6Bytes+SMAC源MAC地址48bit=6Byt ...
- C# 本地文件夹上传至网络服务器中(待续)
一.文件的上传参考 思想,C#FTP上传 /// <summary> /// 上传 /// </summary> /// <param name="filena ...
- 流程管理软件(BPM)功能简介
易协流程管理系统实现将人为控制的业务活动,通过信息化手段实现系统控制,降低人为控制管理的风险以及促进企业的各项决策方针的顺利实施. 系统目标: 实现管理的规范化.制度化.程序化: 帮助企业将内控制度流 ...
- adb命令检测apk启动时间、内存、CPU使用情况、流量、电池电量等——常用的adb命令
ADB:Android Debug Bridge,是Android SDK里一个可以直接操作安卓模拟器或真实设备的工具,颇为强大. 检测APP: adb shell am start -W p ...
- Shiro的校验Session是否过期处理的过程
首先开启定时扫描活跃的session进行校验 <!-- shiro会话管理 --> <!-- 即用户登录后就是一次会话,在没有退出之前,它的所有信息都在会话中:会话可以是普通 Jav ...
- Scrum由来
历史故事 在越南战争期间(1955年-1975年),对于美国战机飞行员而言,要执行100次飞行任务,飞到敌国领空被击落的概率是50%. 1967年,萨瑟兰还是一个没有经验的年轻飞行员,当时却是做最危险 ...
- 封装basedao及动态创建新类型的java数组
package com.huawei.base; import java.io.Serializable;import java.lang.reflect.Array;import java.lang ...
- web前端整套面试题(三)--网易的面试题
题型分析: 一.选择题部分(30分) 元素出栈可能性 排序方法的优缺点 HTTP请求方法 关系型数据库种类 多线程(进程与线程共享) 计算机网络协议 linux指令 JQuery实现方法 二.编程题( ...