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)
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)