好多程序都給結構體變量設定了一個結構體指針 例如:
PAbc = ^TAbc;
TAbc = record
a: string[10];
b: string[5];
c: string[1];
end;
var
Abc: PAbc;
New(Abc);
...
Dispose(Abc); ...
我不清楚這是為什么 定義結構體變量的時候可以直接 var Abc: TAbc; 這樣做啊,為什么要PAbc = ^TAbc;呢?僅僅是為內存的分配與釋放么? 回答: 這個問題實際上與Delphi 的語法結構有着密切的關系。因為Delphi 所使用的語言是Pascal 所以在Pascal 中結構體與C++的結構體有着很多相似的地方. 因為結構體經常被看做是一種變量類型.作為一種類的變體,結構體在聲明實例的時候就被構建了. 也正是這個原因所以 Delphi 的結構體並沒有 Create(構建) 與 Destory(析構) 函數. 順便說一下,在變量區 聲明的Delphi 的類變量 實際上是一個指針. 在你聲明:(var 類實例名稱: 類名) 時“類實例名稱”並沒有被創建, 而要等到你使用 (類實例名稱 := 類名.Create(參數1,參數2...)) 這樣的情況下 這個類變量才會指向一個 存在的類實例. 這個類變量可以使用.
而PAbc = ^TAbc; 則正好聲明了PAbc 是 TAbc 這種結構體(變量類型)的指針、這樣就可以避免 了在聲明變量的時候 結構體就已被構建的問題. 而new 和 Dispose 這兩個函數就是為機構體動態地分配和釋放內存的函數.
這個問題,可能比較抽象,但是要是你理解指針的話你可以將結構體想象成整數,而結構體的指針考慮成這個整數 的指針.這樣的話可能理解起來會比較容易.
你之所以問這個問題是因為你不知道什么時候要用指針。Abc: TAbc;很多時候當然可以代替 Abc: PAbc;,但有些時候就必需要用指針, 不然可能會有問題,比如你用一個TList放你的數據,這時候按你那樣說可以用這個Abc: TAbc,然后這樣List.add(@Abc), 但因為這時候Abc內存的分配與釋放是Delphi自己完成的,弄不好它就幫你把內存提前釋放了,這樣就會有問題,所以你要用Abc: PAbc這個, 自己分配(new)和釋放(dispose)內存.當然這只是個例子,還有很多地方不得不用指針的,比如要實現鏈表等。
