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;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

type
  TRec = record       {定義結構 TRec}
    name: string[12];
    age: Word;
  end;
  TPRec = ^TRec;      {定義 TRec 結構的指針類型 TPRec}

var
  Rec:         TRec;    {聲明結構變量}
  PRec1,PRec2: TPRec;   {聲明 TPRec 指針變量}
  PRec3:      ^TRec;    {聲明 TRec 結構的指針變量, 現在 PRec1 與 PRec3 是不同類型的變量}
  P:           Pointer; {聲明無類型指針}


//通過結構指針訪問結構
procedure TForm1.Button1Click(Sender: TObject);
begin
  Rec.name := '張三';
  Rec.age := 18;

  PRec1 := @Rec; {把 Rec 的地址告訴 PRec1}

  {本來應該這樣訪問}
  ShowMessage(PRec1^.name); {張三}

  {Delphi 允許這樣簡單使用結構指針}
  ShowMessage(PRec1.name);  {張三}

  {如果我們通過指針修改了數據}
  PRec1.name := '李四';

  {那么}
  ShowMessage(Rec.name); {李四}
  {因為 PRec1 和 Rec 所指的是同一個數據}
end;


//如果是單獨使用指針, 必須先給內存
procedure TForm1.Button2Click(Sender: TObject);
begin
  GetMem(PRec2, SizeOf(TRec));
  PRec2.name := '王五';
  PRec2.age := 9;

  ShowMessage(PRec2.name); {王五}

  {手工給的內存, 必須手工釋放}
  FreeMem(PRec2);
end;


//雖是同一個結構的指針, 但還不是一個類型
procedure TForm1.Button3Click(Sender: TObject);
begin
  Rec.name := '孫六';
  Rec.age := 16;

  {把 Rec 的地址給屬於 ^Rec 類型的 PRec3 指針}
  PRec3 := @Rec;
  ShowMessage(PRec3.name); {孫六}

  {如果要把 PRec3 知道的值告訴 PRec1, 需要類型轉換}
  PRec1 := TPRec(PRec3);
  ShowMessage(PRec1.name); {孫六}


  {反過來想, 如果要把 PRec1 知道的值告訴 PRec3 呢?}
  Rec.name := '趙七';
  Rec.age := 24;
  PRec1 := @Rec;
  ShowMessage(PRec1.name); {趙七}

  {這樣轉換}
  TPRec(PRec3) := PRec1;
  ShowMessage(PRec3.name); {趙七}
end;


//用無類型指針讀寫 TRec 中的數據
procedure TForm1.Button4Click(Sender: TObject);
begin
  Rec.name := '杜八';
  Rec.age := 36;

  P := @Rec;

  {賦值}
  TPRec(P).name := '侯九';

  {取值}
  ShowMessage(TPRec(P).name); {侯九}
end;

end.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM