是否使用^指向值的规则是什么?

Dyl*_*lan 10 delphi

下面是在delphi中使用指针的简单示例.

Type

TRecord1 = Record
field1 : String;

end; 

procedure TForm1.Button2Click(Sender: TObject);
var
   Rec : TRecord1;
   Ptr: ^TRecord1;

begin
   Rec.field1:= 'field1';
   Ptr := @Rec;
   memo1.Lines.Add (Ptr^.field1); 
   memo1.Lines.Add (Ptr.field1); // it also works.

 end;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,Ptr ^和Ptr都可以工作.似乎delphi是允许用户更灵活地指向值.但只是通过阅读这两行,它们在语法上是不同的,可能意味着不同.在这种情况下两者都有效.但我的问题是:

  1. 用户如何知道在其他情况下^可以或不可以省略^,或者^或没有^意味着相同或不同?
  2. 这些情况是什么?将举例说明.
  3. 为什么?(可选的)

非常感谢提前.

Cos*_*und 9

用户如何知道在其他情况下^可以或不可以省略^,或者^或没有^意味着相同或不同?

这些情况是什么?将举例说明.

普通Pointer没有任何字段或属性,因此无视Delphi的智能,Pointer.Field语法没有意义.因此,在Pointer^.Field和之间不会发生冲突Pointer.Field,因为.如果不取消引用指针,普通语法就没有意义.

如果指针指向的类型没有任何字段,则必须使用^语法.也就是说,当指针是指向基本类型的指针时,或者是无类型指针.

为什么?(可选的)

类实例引用(大多数人称之为"对象")也是Delphi中的指针,我假设引入语法是为了使Pointers更简洁,更像是使用类.它也是无害的,因为如上所述,编译器不能错.

我个人更喜欢^.语法,因为它清楚地表明我正在使用指针而不是记录或类.

  • "类也是Delphi中的指针" - 这不应该是"对象引用也是Delphi中的指针"吗? (4认同)
  • @mjn最好是"类实例也是Delphi中的指针",因为"对象引用"可以引用`object`关键字,不应该吗?无论如何,我们都明白了.;) (3认同)