转自:万一老师的 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 .
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 .