zoukankan      html  css  js  c++  java
  • 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.
  • 相关阅读:
    OutputCache 缓存key的创建 CreateOutputCachedItemKey
    Asp.net Web Api源码调试
    asp.net mvc源码分析DefaultModelBinder 自定义的普通数据类型的绑定和验证
    Asp.net web Api源码分析HttpParameterBinding
    Asp.net web Api源码分析HttpRequestMessage的创建
    asp.net mvc源码分析ActionResult篇 RazorView.RenderView
    Asp.Net MVC 项目预编译 View
    Asp.net Web.config文件读取路径你真的清楚吗?
    asp.net 动态创建TextBox控件 如何加载状态信息
    asp.net mvc源码分析BeginForm方法 和ClientValidationEnabled 属性
  • 原文地址:https://www.cnblogs.com/China3S/p/3285956.html
Copyright © 2011-2022 走看看