如何进行数组类型与数组指针的巧妙利用

这期内容当中小编将会给大家带来有关如何进行数组类型与数组指针的巧妙利用,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

员工经过长期磨合与沉淀,具备了协作精神,得以通过团队的力量开发出优质的产品。成都创新互联坚持“专注、创新、易用”的产品理念,因为“专注所以专业、创新互联网站所以易用所以简单”。公司专注于为企业提供网站设计制作、做网站、微信公众号开发、电商网站开发,微信小程序定制开发,软件定制网站等一站式互联网企业服务。

下面通过存取结构, 慢慢引入了数组类型与指针的一些使用方法; 其中六个小例子的测试内容和结果都是一样的.


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[0..2] of TMyRec;
  i: Integer;
begin
  {写入}
  for i := 0 to 2 do
  begin
    ArrRec[i].F1 := Chr(i+65);
    ArrRec[i].F2 := (i+1) * 10;
  end;

  {读取}
  for i := 0 to Length(ArrRec) - 1 do
    ShowMessageFmt('%s, %d', [ArrRec[i].F1, ArrRec[i].F2]);
end;

{这个只是定义了一块内存, 没用数组的概念, 有点麻烦}
procedure TForm1.Button2Click(Sender: TObject);
var
  buf: PMyRec;
begin
  GetMem(buf, SizeOf(TMyRec) * 3); {申请内存}

  {写入}
  buf^.F1 := 'A';
  buf^.F2  := 10;
  Inc(buf);       {到下一个}
  buf^.F1 := 'B';
  buf^.F2  := 20;
  Inc(buf);
  buf^.F1 := 'C';
  buf^.F2  := 30;

  Dec(buf, 2);    {回到开始}

  {读取}
  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, 2);    {回到开始}
  FreeMem(buf);   {释放内存}
end;

{可以给结构定义一个数组类型}
procedure TForm1.Button3Click(Sender: TObject);
type
  TArr = array of TMyRec;
var
  buf: PMyRec;
  i: Integer;
begin
  GetMem(buf, SizeOf(TMyRec) * 3);

  for i := 0 to 2 do
  begin
    TArr(buf)[i].F1 := Chr(i+65);
    TArr(buf)[i].F2 := (i+1) * 10;
  end;

  for i := 0 to 2 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, 3);
  for i := 0 to 2 do
  begin
    Arr[i].F1 := Chr(i+65);
    Arr[i].F2 := (i+1) * 10;
  end;

  for i := 0 to 2 do
    ShowMessageFmt('%s, %d', [Arr[i].F1, Arr[i].F2]);
end;

{使用一个元素的数组指针, 这是很常用的}
procedure TForm1.Button5Click(Sender: TObject);
type
  PArr = ^TArr;
  TArr = array[0..0] of TMyRec;
var
  buf: PArr;
  i: Integer;
begin
  GetMem(buf, SizeOf(TMyRec) * 3);

  for i := 0 to 2 do
  begin
    buf^[i].F1 := Chr(i+65);
    buf^[i].F2 := (i+1) * 10;
  end;

  {用这种方法不能像下面这样读写, 也就是 [] 中不能是超过 0 的常数, 但可以用变量}
  {这也容易理解, 因为常量会直接编译到代码中, 在没有分配内存以前, 编译器不知道数组会更大}
  {要解决这个问题需要用下一个方法}
//  buf[0].F1 := 'A';
//  buf[0].F2 := 10;
//  buf[1].F1 := 'B';
//  buf[1].F2 := 20;
//  buf[2].F1 := 'C';
//  buf[2].F2 := 30;

  for i := 0 to 2 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[0..100000] of TMyRec; {不要担心内存暴涨, 使用时我们只用其指针}
var
  buf: PArr;
  i: Integer;
begin
  GetMem(buf, SizeOf(TMyRec) * 3);

  for i := 0 to 2 do
  begin
    buf^[i].F1 := Chr(i+65);
    buf^[i].F2 := (i+1) * 10;
  end;

  {和上例不同的是, 下面的代码也可以}
//  buf[0].F1 := 'A';
//  buf[0].F2 := 10;
//  buf[1].F1 := 'B';
//  buf[1].F2 := 20;
//  buf[2].F1 := 'C';
//  buf[2].F2 := 30;

  for i := 0 to 2 do
    ShowMessageFmt('%s, %d', [buf[i].F1, buf[i].F2]);

  FreeMem(buf);
end;

end.

上述就是小编为大家分享的如何进行数组类型与数组指针的巧妙利用了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注创新互联行业资讯频道。


当前文章:如何进行数组类型与数组指针的巧妙利用
文章网址:http://myzitong.com/article/gopspo.html