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

剛剛在羣裏看到一個這樣的問題數組

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

image

能夠看到若是用inc移動指針,而且會按照指針的類型進行累加,上面PInteger類型Inc後是增長的SizeOf(Integer)。指向數組的下一個元素。io

若是單純的轉換成整數來 + 1會 指針的值就是$12EA75顯然不是指向下一個元素。固然你取到的值也是錯誤的。以下面的圖編譯

image

顯然d^不是咱們想要的數據。

 

除了用inc,也能夠這樣作,下面的作法也是正確的。

image

請操做指針的朋友們注意啦。

 

*以上代碼在XE6下面測試運行

 

*注意沒有IntPtr類型的能夠本身定義下類型

type

   IntPtr = cardinal

 

==========================================

DIOCP官方社區|MyBean官方社區

http://www.diocp.org/

相關文章
相關標籤/搜索