Delphi 是否使用^指向值的规则是什么?
下面是一个在delphi中使用指针的简单示例Delphi 是否使用^指向值的规则是什么?,delphi,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); m
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;
在这种情况下,Ptr^和Ptr都起作用。delphi似乎是为了让用户更灵活地指向值。但是仅仅通过阅读这两行文字,它们在语法上是不同的,并且可能意味着不同。在这种情况下,两者都起作用。但我的问题是:
非常感谢。ptr.property永远都是无效的,并且与ptr^.property截然不同,因此Delphi允许您省略^。如果未键入ptr(或是基本数据类型),则始终需要^ 在其他情况下,用户如何知道^可以省略或不可以省略,或者带^或不带^表示相同或不同 这些情况是什么?请举例说明 普通的
指针
没有任何字段或属性,因此忽略Delphi的smarts,指针.Field
语法没有意义。因此,Pointer^.Field
和Pointer.Field
之间不会有冲突,因为如果不取消对指针的引用,简单的
语法是没有意义的
如果指针指向的类型没有任何字段,则必须使用^
语法。也就是说,当指针是指向基本类型的指针或非类型指针时
为什么??(可选)
类实例引用(大多数人会称之为“对象”)也是Delphi中的指针,我假设引入这种语法是为了减少使用指针的繁琐,更像是使用类。它也是无害的,因为如上所述,编译器不会出错
我个人更喜欢
^.
语法,因为它清楚地表明我使用的是指针,而不是记录或类。它非常简单。如果ptr.field的使用是明确的,即如果它不能有ptr^.field以外的任何其他含义,则可以省略^
但只有到那时。如果省略“^”会产生一个不明确的结构(即它可能具有不同的含义),则不能省略它。唯一的区别是
Ptr1 := Ptr2
不等于
Ptr1^ := Ptr2^
第一行将使Ptr1和Ptr2指向同一内存区域,第二行将Ptr2指向的值分配给Ptr1指向的“变量”
出于这个原因,我认为允许Ptr.Field值语法应该是一个错误,因为即使编译器端不会产生歧义,它也会引入一种惰性的代码编写方式,在上述情况下可能会适得其反。“类也是Delphi中的指针”-这不应该是“对象引用也是Delphi中的指针”吗?@mjn最好是“类实例也是Delphi中的指针”,因为“对象引用”可以引用
Object
关键字,不是吗?不管怎样,我们都明白了重点@A.Bouchez,因为对象是值类型的对象引用,所以只能表示这一类型。我个人更喜欢在讨论中使用object来表示类的实例。这就不那么冗长了。“类实例也是Delphi中的指针”听起来也不正确:)+1“我个人更喜欢^.语法,因为它让我明白了….”我也是。当ptr
是指针类型(包括隐式指针)时,可以省略解引用。ptr.property是有效的语法,即使ptr^.property更正确。@A.Bouchez:我想你误解了这里的答案。他与科斯明的观点相同,他说,ptr.property
永远不会有意义,因此德尔福不会做错任何事(+1以弥补否决票)@Smasher,@A.Bouchez,我还认为高迪回答的措辞确实令人困惑:如果你理解根本问题,你可能会猜出其含义,但除此之外,答案是误导性的。A.Bouchez是完全正确的,ptr.property
是有效的语法,没有进一步的解释,一半的答案是不正确的。