zoukankan      html  css  js  c++  java
  • 【杂谈指针】- 指针的移动

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

    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/

  • 相关阅读:
    pat每日刷题计划--day70
    pat每日刷题计划--day69
    pat每日刷题计划--day68
    pat每日刷题计划--day67
    pat每日刷题计划--day66
    SpringBoot+MyBatis+MySQL读写分离
    SpringMVC源码分析
    ActiveMQ从入门到精通(三)
    ActiveMQ从入门到精通(二)
    ActiveMQ从入门到精通(一)
  • 原文地址:https://www.cnblogs.com/DKSoft/p/4125098.html
Copyright © 2011-2022 走看看