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;
我正在尝试查看如何创建指向简单记录的指针。
我在发帖前搜索过类似的主题,但很混乱。
我创建的 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;