剛剛在群裡看到一個這樣的問題
MonoPixel: PByte; Inc(Integer(MonoPixel));這個在32位下沒問題,為啥64位不能編譯呢?
咋一看,以為是把裡面的值進行累加,後來一想應該是移動一下指針。
對於這種移動指針的做法有兩個錯誤:
第一個是用了Integer,來轉換指針如果在32位下面顯然是沒有問題的,但是如果是64位,指針是64位,顯然再用Integer是錯誤的。
第二個轉換成Ineger後加一,那就相當於整數值 + 1,在PByte時沒有問題,因為Byte也是一個字節。但是如果是PInteger指針就會出現錯誤。
我們來看下代碼:
如果是PInteger下面應該怎麼樣做:
var p, d:PInteger; x : array [0..10] of Integer; begin x[5] := 120; p := @x; d := p; Inc(d, 5);
首先所有的指針都是一個整數值
可以看到如果用inc移動指針,並且會按照指針的類型進行累加,上面PInteger類型Inc後是增加的SizeOf(Integer)。指向數組的下一個元素。
如果單純的轉換成整數來 + 1會 指針的值就是$12EA75顯然不是指向下一個元素。當然你取到的值也是錯誤的。如下面的圖
顯然d^不是我們想要的數據。
除了用inc,也可以這樣做,下面的做法也是正確的。
請操作指針的朋友們注意啦。
*以上代碼在XE6下面測試運行
*注意沒有IntPtr類型的可以自己定義下類型
type
IntPtr = cardinal
==========================================
http://www.diocp.org/