pointers - 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;
解决方案
C
应该包含的地址A
,所以 make
C := @A;
其余代码将根据需要运行。
另请注意,这C.Field1
是隐式取消引用,它确实可以作为 C^.Field1
目前
C^ := A;
表示将A
记录的内容分配给由 寻址的内存区域C
,但未分配此内存 - 这就是发生访问冲突的原因。(要分配内存,您可以 make New(C)
,但这不是您的目的所必需的)
此外,如果您要积极使用指针进行记录,您可以定义类型
PMyRecord = ^TMyRecord;
推荐阅读
- python - 如何将相同的字典添加到具有修改值的列表中
- python - 有没有办法重命名 Keras 模型的指标和损失?
- java - Java 8 Streams 减少删除重复项,保留最新条目
- vue.js - Vuetify - 能够选择父节点而不打开它们
- python - 如何使此函数从 Python 中的数组行返回一对组合?
- php - 是否有反转“array_column”的内置/短 PHP 函数?
- tfs - TFS 构建步骤 - 执行 POST Web 请求
- reactjs - window.stripe 的事件监听器
- excel - 在单元格中添加减号
- sql - 在 SQL 中将 2 个结果合二为一