Delphi 記錄類型- 結構指針

 

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.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章