剛剛在羣裏看到一個這樣的問題數組
MonoPixel: PByte;
Inc(Integer(MonoPixel));這個在32位下沒問題,爲啥64位不能編譯呢?
咋一看,覺得是把裏面的值進行累加,後來一想應該是移動一下指針。測試
對於這種移動指針的作法有兩個錯誤:spa
第一個是用了Integer,來轉換指針若是在32位下面顯然是沒有問題的,可是若是是64位,指針是64位,顯然再用Integer是錯誤的。指針
第二個轉換成Ineger後加一,那就至關於整數值 + 1,在PByte時沒有問題,由於Byte也是一個字節。可是若是是PInteger指針就會出現錯誤。code
咱們來看下代碼:blog
若是是PInteger下面應該怎麼樣作:get
var p, d:PInteger; x : array [0..10] of Integer; begin x[5] := 120; p := @x; d := p; Inc(d, 5);
首先全部的指針都是一個整數值it
能夠看到若是用inc移動指針,而且會按照指針的類型進行累加,上面PInteger類型Inc後是增長的SizeOf(Integer)。指向數組的下一個元素。io
若是單純的轉換成整數來 + 1會 指針的值就是$12EA75顯然不是指向下一個元素。固然你取到的值也是錯誤的。以下面的圖編譯
顯然d^不是咱們想要的數據。
除了用inc,也能夠這樣作,下面的作法也是正確的。
請操做指針的朋友們注意啦。
*以上代碼在XE6下面測試運行
*注意沒有IntPtr類型的能夠本身定義下類型
type
IntPtr = cardinal
==========================================