您的位置:首页 > 编程语言 > Delphi

Delphi : record 记录类型 - 结构指针

2014-01-16 15:49 357 查看
unitUnit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes,Graphics, Controls,Forms,

Dialogs,StdCtrls;

type

TForm1 =class(TForm)

Button1:TButton;

Button2:TButton;

Button3:TButton;

Button4:TButton;

procedureButton1Click(Sender:TObject);

procedureButton2Click(Sender:TObject);

procedureButton3Click(Sender:TObject);

procedureButton4Click(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.

来源:http://blog.sina.com.cn/s/blog_4ad042e50102e1nd.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: