2011-07-13 41 views
10

下面是一個在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; 

在這種情況下,Ptr ^和Ptr都有效。看來delphi允許用戶在指向該值時有更大的靈活性。但是通過閱讀兩條線,它們在語法上有所不同,可能意味着不同。在這種情況下,兩個工作。但我的問題是:

  1. 用戶怎樣才能知道在^可以或不可以被省略 其他情況下,或在與^或不^意味着相同或不同?
  2. 這些情況是什麼?例子將不勝感激。
  3. 爲什麼? (可選)

非常感謝。

+0

當'ptr'是一個指針類型(包括隱式指針)時,可以省略解引用。 –

回答

9

在其他情況下,用戶如何知道^可以或不可以省略,或者當^或沒有時^表示相同或不同?

這些情況是什麼?例子將不勝感激。

一個普通Pointer沒有任何字段或屬性,所以忽略了德爾福的智慧,在Pointer.Field語法沒有意義。因此,Pointer^.FieldPointer.Field之間不能有衝突,只是因爲如果不取消引用指針,那麼普通的.語法就沒有意義。

如果指針指向的類型沒有任何字段,則必須使用^語法。也就是說,當指針是一個指向基本類型的指針時,或者是一個無類型指針。

爲什麼? (可選)

類實例引用(大多數人會稱之爲「對象」)也是Delphi中的指針,我認爲引入的語法使得使用指針時不那麼冗長,更像是使用類。它也是無害的,因爲如上所述,編譯器不會錯誤。

我個人更喜歡^.的語法,因爲它明確表示我正在使用指針而不是記錄或類。

+4

「類也是Delphi中的指針」 - 不應該是「對象引用也是Delphi中的指針」? – mjn

+3

@mjn最好是「類實例也是Delphi中的指針」,因爲「對象引用」可以引用「對象」關鍵字,不是嗎?無論如何,我們都明白這一點。 ;) –

+0

@ A.Bouchez因爲對象是一個值類型的對象引用可能意味着只有一個這樣的。我個人更喜歡在討論中使用對象來表示一個類的實例。它不那麼羅嗦。 –

2

ptr.property永遠不會有效,與ptr^.property明顯不同,因此Delphi允許您省略^。如果沒有鍵入ptr(或者是基本的數據類型),那麼總是需要^。

+0

ptr.property是一個有效的語法,即使ptr^.property更加正確。 –

+2

@ A.Bouchez:我想你在這裏誤解了答案。他和Cosmin一樣,並說'ptr.property'永遠不會有意義,所以Delphi可以做任何事情都沒有錯(+1來彌補downvote) – jpfollenius

+2

@Smasher,@ A.Bouchez,我也認爲措辭Gordy的回答確實令人困惑:如果你理解了潛在的問題,你可能會猜到它的含義,但否則答案會有誤導性。 A.Bouchez是完全正確的,'ptr.property' *是*有效的語法,並且沒有進一步的解釋使答案的一半不正確。 –

1

這很簡單。如果使用ptr.field是明確的,即,如果它不能具有除ptr^.field之外的任何其他含義,則可以省略^。

但只有這樣。在省略^創建不明確的構造(即其可能具有不同含義的地方)的情況下,它不能被省略。

3

唯一的區別是,

Ptr1 := Ptr2 

不等於

Ptr1^ := Ptr2^ 

第一行將使PTR1和PTR2以指向同一個存儲區域,所述第二將分配Ptr2指向Ptr1指向的「變量」的值。

因爲這個原因,我認爲允許Ptr.Field值語法應該是一個錯誤,因爲即使編譯器端沒有出現歧義,它也會引入一種懶惰的編寫代碼的方式,這可能會在上述情況中發生逆向。