【杂谈指针】- 指针的移动
2014-11-26 22:11
246 查看
刚刚在群里看到一个这样的问题
咋一看,以为是把里面的值进行累加,后来一想应该是移动一下指针。
对于这种移动指针的做法有两个错误:
第一个是用了Integer,来转换指针如果在32位下面显然是没有问题的,但是如果是64位,指针是64位,显然再用Integer是错误的。
第二个转换成Ineger后加一,那就相当于整数值 + 1,在PByte时没有问题,因为Byte也是一个字节。但是如果是PInteger指针就会出现错误。
我们来看下代码:
如果是PInteger下面应该怎么样做:
首先所有的指针都是一个整数值
可以看到如果用inc移动指针,并且会按照指针的类型进行累加,上面PInteger类型Inc后是增加的SizeOf(Integer)。指向数组的下一个元素。
如果单纯的转换成整数来 + 1会 指针的值就是$12EA75显然不是指向下一个元素。当然你取到的值也是错误的。如下面的图
显然d^不是我们想要的数据。
除了用inc,也可以这样做,下面的做法也是正确的。
请操作指针的朋友们注意啦。
*以上代码在XE6下面测试运行
*注意没有IntPtr类型的可以自己定义下类型
type
IntPtr = cardinal
==========================================
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官方社区
http://www.diocp.org/相关文章推荐
- 控件(一)——实现列表框中指定条目移位和移动指针到指定位置
- php数组函数序列之prev() - 移动数组内部指针到上一个元素的位置,并返回该元素值
- C 杂谈之 指针与数组 (一)
- C语言杂谈:指针与数组 (上)
- C++ new一个数组时,指针移动程序崩溃问题
- 杂谈指针捆绑存储区
- php数组函数序列之next() - 移动数组内部指针到下一个元素的位置,并返回该元素值
- 指向运算符会移动指针吗?
- 当鼠标移动到按钮上时设置鼠标指针形状
- Mac系统鼠标在移动时,指针变的很大,是什么鬼?
- 鼠标移动上鼠标指针各种变化
- 鼠标移动上鼠标指针各种变化
- php数组函数序列之next() - 移动数组内部指针到下一个元素的位置,并返回该元素值
- trim()函数:仅仅改变指针指向,没有删除及移动字符,提高了效率
- 【php数组函数序列】之next() - 移动数组内部指针到下一个元素的位置,并返回该元素值
- C 杂谈之 指针与数组 (二)
- 2011 移动互联大会杂谈:天网正在到来,T800 不远了
- git rebase --abort会涉及哪些文件,这个命令会涉及HEAD指针的移动吗?在何种情况下,HEAD不会指向某个具体的分支?
- C语言的指针移动怎么理解
- c++ 通过移动指针改变数组中的每一个值