【问题标题】:Delphi Records - creating a pointer to itDelphi Records - 创建指向它的指针
【发布时间】:2020-11-12 04:42:41
【问题描述】:

我正在尝试了解如何创建指向简单记录的指针。

我在发帖前搜索过类似的主题,但很混乱。

我创建了 A 和 B,其中是实际记录。 然后我有一个变量 C ,我想它只是一个“指向该记录的指针”。 我不希望 C 存储它自己的值,而只是一个指向 A 或 B 的指针。
但是每当 C 被读/写时, 它实际上被写入 A 或 B,无论 C 指向哪个。

换句话说,它就像一个指向对象的指针,但在我的情况下不需要对象。

使用 Delphi 10.3 和 10.4(如果有任何区别),请突出显示。

下面的代码导致第一个 ShowMessage 出现访问冲突。

procedure TForm1.Button2Click(Sender: TObject);
type
  TMyRecord = record
    Field1 : integer;
  end;
var
  A : TMyRecord;
  B : TMyRecord;
  C : ^TMyRecord; // how to declare this as a pointer?
begin
  A.Field1 := 1;
  B.Field1 := 2;

  C^ := A;  // psuedo code to point to A
  A.Field1 := 3;
  showmessage( C^.Field1.ToString );   // result is 3
  C.Field1 := 4;
  showmessage( A.Field1.ToString );   // result is 4

  C^ := B;  // psuedo code to point to A
  C.Field1 := 5;
  showmessage( B.Field1.ToString );   // result is 5
  // anything to free here to avoid memory loss?
end;

【问题讨论】:

    标签: pointers delphi record pascal


    【解决方案1】:

    C 应该包含A 的地址,所以制作

    C := @A; 
    

    其余代码将根据需要运行。

    还要注意C.Field1 是隐式取消引用,它确实像C^.Field1 一样工作


    暂时

    C^ := A;
    

    表示将A 记录的内容分配给C 寻址的内存区域,但该内存未分配——这就是发生访问冲突的原因。 (分配内存,你可以New(C),但这不是你的目的所必需的)

    另外如果你要主动使用指针记录,你可以定义类型

    PMyRecord  =  ^TMyRecord;
    

    【讨论】:

    • 感谢您的指点,字面上和其他方面。 :)
    猜你喜欢
    • 1970-01-01
    • 2015-03-03
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 2021-04-05
    • 1970-01-01
    相关资源
    最近更新 更多