【杂谈指针】- 指针的移动

刚刚在群里看到一个这样的问题数组

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/

相关文章
相关标签/搜索