Delphi 记录 - 创建指向它的指针

Delphi Records - creating a pointer to it

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

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

我创建的 A 和 B 是实际记录。 然后我有一个变量 C,我希望它只是一个 'pointer to this record'。 我不希望 C 存储它自己的值,而只是一个指向 A 或 B 的指针。
但是每当C是read/written到, 它实际上被写入 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;

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

C := @A; 

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

另请注意,C.Field1 是隐式解引用,它实际上与 C^.Field1

一样工作

暂时

C^ := A;

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

此外,如果你打算主动使用指针来记录,你可以定义类型

PMyRecord  =  ^TMyRecord;