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 ...
随机推荐
- acm常用术语
OJ是Online Judge系统的简称,用来在线检测程序源代码的正确性. Accepted (AC) : OK! Your program is correct! Presentation Erro ...
- android 布局中 layout_gravity、gravity、orientation、layout_weight【转】
线性布局中,有 4 个及其重要的参数,直接决定元素的布局和位置,这四个参数是 android:layout_gravity ( 是本元素相对于父元素的重力方向 ) android:gravity (是 ...
- Effective C++笔记:实现
条款26:尽可能延后变量定义式的出现时间 博客地址:http://www.cnblogs.com/ronny/ 转载请注明出处! 有些对象,你可能过早的定义它,而在代码执行的过程中发生了导常,造成了开 ...
- Activity生命周期图
首先看一下Android api中所提供的Activity生命周期图 Activity其实是继承了ApplicationContext这个类,我们可以重写以下方法,如下代码: public class ...
- 2016.6.23 PHP实现新闻发布系统主体部分
1.新闻发布系统的列表: <html><meta http-equiv="Content-Type" content="text/html; chars ...
- LightOJ1316 A Wedding Party(状压DP)
这题事实上只需要关心15个商店和一个起点一个终点,预处理出这几个点之间的最短距离.Floyd会超时,用Dijkstra即可. 然后就是dp[u][S]表示已经经过商店集合S且当前在第u个商店所花的最少 ...
- Unity3D shader脚本
Unity中的shader脚本,是用叫做shaderlab的脚本语言来写.这个unity中的shader不只是DX中HLSL写的顶点和像素shader,而应该说是对应着DX中的Effect脚本,定义了 ...
- 【python游戏编程之旅】第二篇--pygame中的IO、数据
本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 在上一篇中,我们介绍了pygame的入门操作http://www.cnblogs.com/msxh/p/49 ...
- bug 调试了一个下午外加半个晚上的bug
public void queryTaskResult2() throws Exception { HttpServletRequest request = ServletActionContext. ...
- lal
import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.F ...