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

简介: 刚刚在群里看到一个这样的问题 MonoPixel: PByte; Inc(Integer(MonoPixel));这个在32位下没问题,为啥64位不能编译呢?   咋一看,以为是把里面的值进行累加,后来一想应该是移动一下指针。

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

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/

目录
相关文章
|
6月前
C初阶--指针初阶(上):什么是指针+指针类型+野指针(下)
C初阶--指针初阶(上):什么是指针+指针类型+野指针(下)
|
6月前
|
存储 Perl
C初阶--指针初阶(上):什么是指针+指针类型+野指针(上)
C初阶--指针初阶(上):什么是指针+指针类型+野指针(上)
|
6月前
|
存储 编译器
初阶指针(详解)
初阶指针(详解)
13 1
|
8月前
|
存储
初阶指针(纯干货!!!)上
初阶指针(纯干货!!!)
39 0
|
5月前
|
C++
指针就该这么学->C指针进阶
指针就该这么学->C指针进阶
|
8月前
|
编译器 C语言 C++
【C++初阶(三)】引用详解(对比指针)(上)
【C++初阶(三)】引用详解(对比指针)
|
8月前
|
存储 安全 编译器
【C++初阶(三)】引用详解(对比指针)(下)
【C++初阶(三)】引用详解(对比指针)(下)
|
9月前
|
存储
学C的第十七天【指针初阶: 1. 指针是什么?;2. 指针和指针类型;3. 野指针;4. 指针运算】1
1. 指针是什么? (1). 指针是内存中一个最小单元的编号,也就是地址 (2). 平时口语中说的指针,通常指的是指针变量,是用来存放内存地址的变量 总结:指针就是地址,口语中说的指针通常指的是指针变量
|
9月前
学C的第十七天【指针初阶: 1. 指针是什么?;2. 指针和指针类型;3. 野指针;4. 指针运算】2
3. 野指针 概念:野指针就是这种指向的位置时不可知的(随机的、不正确的、没有明确限制的)
|
10月前
|
存储 C语言
C初阶指针
C语言学习第十三弹