2015-11-30 46 views
1

所以根據this(適用於同一頁XE4到XE8):如何指針到一個類型被視爲一個指針,它指向類型的數組

當指示器保持的另一個地址變量,我們說它指向該變量在內存中的位置或存儲在那裏的數據。 對於數組或其他結構化類型,指針保存結構中第一個元素的地址。

對我來說,上述聽起來完全像this

備註:免費帕斯卡爾把球多爲C做了同樣的方式。這意味着指向某種類型的指針可以被看作是這種類型的數組。

從這個角度來看,指針指向這個數組的zeroeth元素。

FPC例如:

program PointerArray; 
var i : Longint; 
    p : ^Longint; 
    pp : array[0..100] of Longint; 
begin 
    for i := 0 to 100 do pp[i] := i; { Fill array } 
    p := @pp[0];      { Let p point to pp } 
    for i := 0 to 100 do 
    if p[i]<>pp[i] then 
     WriteLn (’Ohoh, problem !’) 
end. 

的例子顯然不編譯和抱怨p - Array type required。我從來沒有在delphi見過這樣的shananigans,但是我對embarcadero wiki的信息感到非常困惑。維基本身沒有提供這種使用的例子。

有人可以向我解釋什麼是維基正確的意思?如果它實際上與FPC/C有任何相似之處,有人可以提供一個工作示例嗎?

回答

3

在Delphi中,您必須啓用一個特殊的編譯器模式才能夠將指針看作是指向數組的指針。

 
{$POINTERMATH ON} 

從文檔:該模式與POINTERMATH指令這樣啓用

指針數學是簡單地處理任何類型的指針在一些狹窄的 實例作爲縮放有序,您可以執行直接對指針變量進行簡單的算術運算 。它也允許你使用數組[] 運算符將這樣一個指針變量作爲無限數組對待。注意在上面的例子中,增加一個類型數組 的索引等同於增加一個指向該類型的指針。增量爲1的指針將按字節數組的大小排列,而不是以一個字節爲單位。

POINTERMATH指令具有本地範圍。也就是說,如果您打開 指令並且不在模塊中關閉它,它將一直保持在 ,直到模塊結束。此外,如果您聲明指令 的指令爲ON,則該類型的任何變量都允許縮放 指針算術和數組索引,即使指令的 已關閉也是如此。同樣,由此 指令包圍的任何代碼塊都允許算術在 塊內的任何類型指針的操作,而不管指定的類型指針最初是否是用POINTERMATH ON聲明的 。

該指令隻影響類型指針。類型指針 的變量不允許指針數學特徵,因爲類型指針是 ,它有效地指向一個空元素,它的大小爲0字節。 無類型var或const參數不受影響,因爲它們不是 真指針。

+0

我知道我會facepalm難,剛剛告訴我,該模式是默認情況下。我的錯。謝謝,將盡快接受。 – Raith

+0

此功能是在D2009中引入的。可能他們默認設置爲false,以保持與舊版本的兼容性。 –

+0

它適用於某些類型。自從IIRC,Borland/Turbo Pascal 7開始使用PChar(在$ X +模式下),並且自引入$ POINTERMATH以來默認爲PByte。 –

相關問題