91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何進行數組類型與數組指針的巧妙利用

發布時間:2022-01-04 18:08:48 來源:億速云 閱讀:119 作者:柒染 欄目:大數據

這期內容當中小編將會給大家帶來有關如何進行數組類型與數組指針的巧妙利用,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

下面通過存取結構, 慢慢引入了數組類型與指針的一些使用方法; 其中六個小例子的測試內容和結果都是一樣的.


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.

上述就是小編為大家分享的如何進行數組類型與數組指針的巧妙利用了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

兰溪市| 阳信县| 长武县| 宜昌市| 涪陵区| 夏津县| 广灵县| 密山市| 三穗县| 屯留县| 麻江县| 太仆寺旗| 仁化县| 周至县| 依兰县| 通海县| 平和县| 乃东县| 石嘴山市| 婺源县| 襄城县| 革吉县| 洛扎县| 工布江达县| 涪陵区| 翁源县| 阜新市| 三都| 盈江县| 忻城县| 白山市| 武清区| 安顺市| 蚌埠市| 岫岩| 廉江市| 涿鹿县| 独山县| 肇源县| 开江县| 凉城县|