Pointers 如何使用现有指针将指针分配给记录元素?

Pointers 如何使用现有指针将指针分配给记录元素?,pointers,delphi,Pointers,Delphi,我理解指针的概念以及如何使用,但我只是想澄清我头脑中关于将指针分配给另一个指针已经指向的记录子元素的一些困惑 我在其他地方看到过一些问题,我想问的是同样的问题,但答案在C 如果我有: type TDetails = record Name : string; Origin : string; end; TMsgData = record ID : string; Code : integer; Details : TDetails;

我理解指针的概念以及如何使用,但我只是想澄清我头脑中关于将指针分配给另一个指针已经指向的记录子元素的一些困惑

我在其他地方看到过一些问题,我想问的是同样的问题,但答案在C

如果我有:

type
  TDetails = record
     Name : string;
     Origin : string;
  end;

  TMsgData = record
     ID : string;
     Code : integer;
     Details : TDetails;
  end;

var
  MessageData = array of TMsgData;
很明显,我可以通过以下方式获得指向TMsgData类型的特定记录的指针:

var
  pMessageData = ^TMsgData;

begin
  pMessageData := @MessageData[0];
...
当然,我可以通过标准的去引用,使用指针访问所有的记录元素

但是,如何使用第一个指针获取指向MessageData[0]的详细记录的新指针?我希望避免使用指向指针的指针,因此如果pMessageData是空闲的,我仍然可以使用另一个指针

如果我这样做

name := pMessageData.Details.Name;
然后Delphi会自动取消引用,给我name的值。如果我这样做了:

var
  pMessageDetails = ^TDetails;

begin
  pMessageDetails = @pMessageData.Details;

*or*

  pMessageDetails = Addr(pMessageData^.Details);
这两种方法是给我一个指向原始记录的指针还是给我一个指向原始记录的新指针?

让我们学究一点

pMessageData
是指向
TMsgData
的指针。这意味着
pMessageData^
是一个
TMsgData
,而
pMessageData^。详细信息
是它的
t详细信息

因此,指向此记录的指针是
@(pMessageData^.Details)
,也可以使用函数写入
Addr(pMessageData^.Details)

此外,
@(pMessageData^.Details)
的解析方式与
@pMessageData^.Details
相同,因此可以省略括号

事实上,您甚至可以使用解引用操作符编写
@pMessageData.Details


实际上,您可以使用Delphi本身轻松验证我的结论是否正确:

过程TForm1.FormCreate(发送方:TObject);
变量
pMessageData:^TMsgData;
p1、p2、p3、p4:^t详细信息;
开始
SetLength(MessageData,3);
MessageData[1]。ID:=“Alpha”;
MessageData[1]。代码:=123;
MessageData[1]。详细信息。名称:=“测试”;
MessageData[1]。详细信息。来源:='NYC';
pMessageData:=@MessageData[1];
p1:=@(pMessageData^.详细信息);
p2:=地址(pMessageData^.Details);
p3:=@pMessageData^.详细信息;
p4:=@pMessageData.Details;
ShowMessage(p1^来源);
ShowMessage(p2^来源);
显示消息(p3^来源);
ShowMessage(p4^来源);
ShowMessage(NativeInt(p1.ToString);
ShowMessage(NativeInt(p2).ToString);
ShowMessage(NativeInt(p3.ToString);
ShowMessage(NativeInt(p4.ToString);
ShowMessage(NativeInt(@MessageData[1].详细信息).ToString);//和前四个一样
退出进程(0)
结束;

谢谢@Andreas…我一直在尝试所有这些方法,我试图找出一种方法是否比另一种更好,或者一种方法是否给出了指向指针情况的指针,但它们似乎都给出了相同的结果,而不管原始指针发生了什么。@WartH0g:正确,正如您在上一次测试中看到的,所有四个指针都指向内存中完全相同的位置,即动态数组中第二个
TMsgData
值的
Details
成员。这主要是我缺少的位-如何查看实际地址,以便验证它们是否都指向同一个对象。你的代码非常有用,我保存了它以备将来参考。