程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 【雜談指針】- 指針的移動,雜談指針移動

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

編輯:Delphi

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


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

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);

 

首先所有的指針都是一個整數值

image

可以看到如果用inc移動指針,並且會按照指針的類型進行累加,上面PInteger類型Inc後是增加的SizeOf(Integer)。指向數組的下一個元素。

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

image

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

 

除了用inc,也可以這樣做,下面的做法也是正確的。

image

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

 

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

 

*注意沒有IntPtr類型的可以自己定義下類型

type

   IntPtr = cardinal

 

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

DIOCP官方社區|MyBean官方社區

http://www.diocp.org/

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved