如何将指向某个类型的指针视为指向该类型数组的指针

时间:2015-11-30 13:29:07

标签: delphi pointers

所以根据this(适用于XE4到XE8的同一页面):

  

当指针保存另一个变量的地址时,我们说它指向该变量在内存中的位置或存储在那里的数据。 对于数组或其他结构化类型,指针保存结构中第一个元素的地址。

对我而言,上述声音与this完全相同:

  

备注:Free Pascal处理指针的方式与C的处理方式大致相同。这意味着指向某种类型的指针可以被视为这种类型的数组。

     

从这个角度来看,指针然后指向该数组的零元素。

FPC示例:

program PointerArray;  
var i : Longint;  
    p : ^Longint;  
    pp : array[0..100] of Longint;  
begin  
  for i := 0 to 100 do pp[i] := i; { Fill array }  
  p := @pp[0];                     { Let p point to pp }  
  for i := 0 to 100 do  
    if p[i]<>pp[i] then  
      WriteLn (’Ohoh, problem !’)  
end. 

这个例子显然没有编译和抱怨p - Array type required。我在delphi中从未见过这样的shananigans,但我对embarcadero wiki的信息感到非常困惑。维基本身没有给出这种用法的例子。

有人可以向我解释维基的真正含义吗?如果它实际上与FPC / C类似,那么有人可以提供一个有效的例子吗?

1 个答案:

答案 0 :(得分:3)

在Delphi中,您必须启用特殊的编译器模式才能将指针视为指向数组的指针。使用POINTERMATH指令启用该模式,如下所示:

{$POINTERMATH ON}

来自文档:

  

指针数学只是简单地处理任何给定的类型指针   实例作为缩放序数,您可以在其中执行简单的算术运算   直接对指针变量进行操作。它也允许你   使用数组[]将这样的指针变量视为无界数组   运营商。请注意,在上面的示例中,递增索引   一个类型的数组相当于将指针递增到该数组   类型。增量为1会使指针按数组大小进行碰撞   元素以字节为单位,而不是一个字节。

     

POINTERMATH指令具有本地范围。也就是说,如果你转过来   指令ON并且不在模块中将其关闭,它将保持打开状态   直到模块结束。此外,如果您声明一个类型指针   使用此指令ON,该类型的任何变量都允许缩放   指针算术和数组索引,即使在指令之后也是如此   已关闭同样,任何代码块都被此包围   指令允许对任何类型指针进行算术运算   块,无论键入的指针是否最初   用POINTERMATH ON声明。

     

此指令仅影响键入的指针。指针类型的变量   不允许指针数学功能,因为类型指针是   有效地指向void元素,其大小为0字节。   未输入的var或const参数不受影响,因为它们不受影响   真指示。