首页 > 解决方案 > Delphi Records - 创建指向它的指针

问题描述

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

在发布之前我已经搜索过类似的主题,但这很令人困惑。

我创建了 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;

标签: pointersdelphirecordpascal

解决方案


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

C := @A; 

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

另请注意,这C.Field1是隐式取消引用,它确实可以作为 C^.Field1


目前

C^ := A;

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

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

PMyRecord  =  ^TMyRecord;

推荐阅读