Delphi Records - 创建一个指向它的指针

Pet*_* W. 0 delphi pascal pointers record

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

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

我创建了 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;
Run Code Online (Sandbox Code Playgroud)

MBo*_*MBo 5

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

C := @A; 
Run Code Online (Sandbox Code Playgroud)

其余代码将根据需要工作。

另请注意,这C.Field1是隐式取消引用,它确实有效 C^.Field1


目前

C^ := A;
Run Code Online (Sandbox Code Playgroud)

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

此外,如果您要主动使用指针进行记录,则可以定义类型

PMyRecord  =  ^TMyRecord;
Run Code Online (Sandbox Code Playgroud)