delphi 数组类型与数组指针的巧妙利用
{本例通过存取结构, 慢慢引入了数组类型与指针的一些使用方法; 其中六个小例子的测试内容和结果都是一样的.
--------------------------------------------------------------------------------}
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
Button6: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Button6Click(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
type {先定义结构和结构指针}
PMyRec = ^TMyRec;
TMyRec = record
F1: Char;
F2: Word;
end;
{用静态数组储存或读写结构很方便}
procedure TForm1.Button1Click(Sender: TObject);
var
ArrRec: array[..] of TMyRec;
i: Integer;
begin
{写入}
for i := to do
begin
ArrRec[i].F1 := Chr(i+);
ArrRec[i].F2 := (i+) * ;
end;
{读取}
for i := to Length(ArrRec) - do
ShowMessageFmt('%s, %d', [ArrRec[i].F1, ArrRec[i].F2]);
end;
{这个只是定义了一块内存, 没用数组的概念, 有点麻烦}
procedure TForm1.Button2Click(Sender: TObject);
var
buf: PMyRec;
begin
GetMem(buf, SizeOf(TMyRec) * ); {申请内存}
{写入}
buf^.F1 := 'A';
buf^.F2 := ;
Inc(buf); {到下一个}
buf^.F1 := 'B';
buf^.F2 := ;
Inc(buf);
buf^.F1 := 'C';
buf^.F2 := ;
Dec(buf, ); {回到开始}
{读取}
ShowMessageFmt('%s, %d', [buf^.F1, buf^.F2]);
Inc(buf); {到下一个}
ShowMessageFmt('%s, %d', [buf^.F1, buf^.F2]);
Inc(buf);
ShowMessageFmt('%s, %d', [buf^.F1, buf^.F2]);
Dec(buf, ); {回到开始}
FreeMem(buf); {释放内存}
end;
{可以给结构定义一个数组类型}
procedure TForm1.Button3Click(Sender: TObject);
type
TArr = array of TMyRec;
var
buf: PMyRec;
i: Integer;
begin
GetMem(buf, SizeOf(TMyRec) * );
for i := to do
begin
TArr(buf)[i].F1 := Chr(i+);
TArr(buf)[i].F2 := (i+) * ;
end;
for i := to do
ShowMessageFmt('%s, %d', [TArr(buf)[i].F1, TArr(buf)[i].F2]);
FreeMem(buf);
end;
{直接用动态数组也行}
procedure TForm1.Button4Click(Sender: TObject);
var
Arr: array of TMyRec;
i: Integer;
begin
SetLength(Arr, );
for i := to do
begin
Arr[i].F1 := Chr(i+);
Arr[i].F2 := (i+) * ;
end;
for i := to do
ShowMessageFmt('%s, %d', [Arr[i].F1, Arr[i].F2]);
end;
{使用一个元素的数组指针, 这是很常用的}
procedure TForm1.Button5Click(Sender: TObject);
type
PArr = ^TArr;
TArr = array[..] of TMyRec;
var
buf: PArr;
i: Integer;
begin
GetMem(buf, SizeOf(TMyRec) * );
for i := to do
begin
buf^[i].F1 := Chr(i+);
buf^[i].F2 := (i+) * ;
end;
{用这种方法不能像下面这样读写, 也就是 [] 中不能是超过 0 的常数, 但可以用变量}
{这也容易理解, 因为常量会直接编译到代码中, 在没有分配内存以前, 编译器不知道数组会更大}
{要解决这个问题需要用下一个方法}
// buf[].F1 := 'A';
// buf[].F2 := ;
// buf[].F1 := 'B';
// buf[].F2 := ;
// buf[].F1 := 'C';
// buf[].F2 := ;
for i := to do
ShowMessageFmt('%s, %d', [buf[i].F1, buf[i].F2]);
FreeMem(buf);
end;
{使用一个超大的数组指针, Delphi 的 TList 类就是这么干的}
procedure TForm1.Button6Click(Sender: TObject);
type
PArr = ^TArr;
TArr = array[..] of TMyRec; {不要担心内存暴涨, 使用时我们只用其指针}
var
buf: PArr;
i: Integer;
begin
GetMem(buf, SizeOf(TMyRec) * );
for i := to do
begin
buf^[i].F1 := Chr(i+);
buf^[i].F2 := (i+) * ;
end;
{和上例不同的是, 下面的代码也可以}
// buf[].F1 := 'A';
// buf[].F2 := ;
// buf[].F1 := 'B';
// buf[].F2 := ;
// buf[].F1 := 'C';
// buf[].F2 := ;
for i := to do
ShowMessageFmt('%s, %d', [buf[i].F1, buf[i].F2]);
FreeMem(buf);
end;
end.
delphi 数组类型与数组指针的巧妙利用的更多相关文章
- C语言 数组类型与数组指针类型
//数组类型与数组指针类型 #include<stdio.h> #include<stdlib.h> #include<string.h> void main(){ ...
- C指针 指针和数组 二维数组的指针 指针应用
直接到变量名标识的存储单元中读取变量的值--直接寻址 通过其他变量间接找到变量的地址读取变量的值--间接寻址 指针变量存放地址 显示变量的地址 指针变量使用前必须初始化,若不知指向哪,可先指向NULL ...
- C 数组类型语法总结
数组类型语法总结 数组指针 和 指针数组 区分 数组指针是一个指针,只对应类型的数组.指针数组是一个数组,其中每个元素都是指针 数组指针遵循指针运算法则.指针数组拥有c语言数组的各种特性 数组类型重命 ...
- Java 方法重载与引用数组类型
1.方法重载 1)方法的签名 方法的签名包含方法名和参数列表 一个类中,不可以有两个方法的签名完全相同,即一个类中不能有两个方法的方法名和参数列表都一样. public class Test{ pu ...
- php中对象类型与数组之间的转换
1.刚看视频学习的时候看到一个困扰很久的问题, 有时候我们在进行做项目的时候会碰到的一个小问题.举一个小例子. 获取一个xml文件里面的数据. xml.xml文件如下: <?xml versi ...
- matlab结构体、数组和单元数组类型的创建
matlab结构体.数组和单元数组类型的创建 @ 目录 matlab结构体.数组和单元数组类型的创建 matlab结构体类型 数组类型 单元数组类型 matlab结构体类型 通过字段赋值创建结构体 创 ...
- 数组Array、数组API
1.数组:批量管理多个数据的存储空间. 数组的作用:现实中,批量管理多个数据都是集中分组存放,良好的数据结构,可极大提高程序的执行效率! 优点:方便查找 2.创建数组:(4种方式) (1)var 变量 ...
- STL数组和com数组相互转换的做法
作者:朱金灿 来源:http://blog.csdn.net/clever101 STL的泛型数组是vetor,com的泛型数组类型是VARIANT.二者怎样能相互转化呢?就是说怎么把一个vector ...
- delphi 数组类型
数组类型 数组类型定义了一组指定类型的元素序列,在方括号中填入下标值就可访问数组中的元素.定义数组时,方括号也用来指定可能的下标值.例如,下面的代码中定义了一个有 24 个整数的数组:type ...
随机推荐
- 2016"百度之星" - 初赛(Astar Round2A) 1004 D Game 区间DP
D Game Problem Description 众所周知,度度熊喜欢的字符只有两个:B 和D. 今天,它发明了一个游戏:D游戏. 度度熊的英文并不是很高明,所以这里的D,没什么高深的含义,只 ...
- HDU 2819 — Swap 二分匹配
Swap Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- 几种php 删除数组元素方法
几种php教程 删除数组元素方法在很多情况下我们的数组会出现重复情况,那我们删除数组中一些重复的内容怎么办,这些元素我必须保持他唯一,所以就想办法来删除它们,下面利用了遍历查询来删除重复数组元素的几种 ...
- Burp Suite使用介绍
Burp Suite使用介绍(一) 22人收藏 收藏 2014/05/01 19:54 | 小乐天 | 工具收集 | 占个座先 Getting Started Burp Suite 是用于攻击web ...
- Ajax过程
http://www.cnblogs.com/daicunya/p/6227550.html 1.创建XMLHttpRequest对象,也就是创建一个异步调用对象. 2.创建一个新的HTTP请求,并指 ...
- 关于InputStream.read()方法的阻塞原理的测试
最近在一家公司做java实习,写了个网络字节采集器.写了个单例TCPServer来采集数据,其中用到了InputStream.read()来读取数据.产生了一系列问题,下面做下总结: 关于while( ...
- python IDLE 改变窗口背景颜色
初学Python,想必大家拿来练习最多的IDE就是Python自带的IDLE了,但是默认的代码配色及语法高亮主题确实很不适应. 能不能把IDLE配置成像sublime_text那样的主题呢? 答案是当 ...
- BZOJ4311 : 向量
考虑离线操作,求出每个向量存在的时间区间,用时间线段树来进行分治,在每个节点求出凸壳后,询问时在凸壳上三分答案.时间复杂度$O(n\log^2n)$. #include<cstdio> # ...
- POJ 3071 Football(概率DP)
题目链接 不1Y都对不住看过那么多年的球.dp[i][j]表示i队进入第j轮的概率,此题用0-1<<n表示非常方便. #include <cstdio> #include &l ...
- 【NOI2015】品酒大会
一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品酒家”和“首席猎手”两个奖项,吸引了众多品酒师参加. 在大会的晚餐上,调酒师 Rainbow 调制了 ...