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.