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 .

 

 

转载于:https://www.cnblogs.com/rogee/archive/2010/09/20/1831994.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值