天天看點

【雜談指針】- 指針的移動

剛剛在群裡看到一個這樣的問題

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

DIOCP官方社群|MyBean官方社群