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

Delphi 如何将指向类型的指针视为指向该类型数组的指针,delphi,pointers,Delphi,Pointers,因此根据(适用于XE4至XE8的同一页面): 当指针持有另一个变量的地址时,我们说它指向该变量在内存中的位置或存储在内存中的数据对于数组或其他结构化类型,指针保存结构中第一个元素的地址。 对我来说,上述情况听起来很像: 备注:FreePascal对待指针的方式与C非常相似。这意味着指向某种类型的指针可以被视为这种类型的数组 从这个角度来看,指针指向这个数组的第零个元素 FPC示例: program PointerArray; var i : Longint; p : ^Longi

因此根据(适用于XE4至XE8的同一页面):

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

对我来说,上述情况听起来很像:

备注:FreePascal对待指针的方式与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. 
程序指针阵列;
变量i:长型;
p:^Longint;
pp:Longint的数组[0..100];
开始
对于i:=0到100 do pp[i]:=i;{填充数组}
p:=@pp[0];{让p指向pp}
对于i:=0到100 do
如果p[i]pp[i]那么
WriteLn(‘哦,问题!’
结束。
该示例显然没有编译,并抱怨
p
-
所需的数组类型
。我从未在德尔福看到过这样的骗局,但我对embarcadero维基上的信息感到非常困惑。维基本身没有给出此类使用的例子


有人能给我解释一下维基的确切含义吗?如果它实际上在任何方面与FPC/C类似,有人能提供一个工作示例吗?

在Delphi中,您必须启用特殊的编译器模式,以便能够将指针视为指向数组的指针。该模式通过如下指令启用:

{$POINTERMATH ON} {$POINTERMATH ON} 从文件中:

指针数学只是以某种狭义的方式处理任何给定类型的指针 实例作为可执行简单算术的缩放序号 直接对指针变量执行操作。它还允许您 使用数组[]将此类指针变量视为无界数组 操作人员请注意,在上面的示例中,增加 类型的数组相当于递增指向该类型的指针 类型。增量为1时,指针与数组的大小会发生碰撞 元素以字节为单位,而不是以一个字节为单位

POINTERMATH指令具有局部作用域。也就是说,如果你把这个 指令打开,但不要在模块中将其关闭,它将保持打开状态 直到模块结束。另外,如果您声明一个类型化指针 打开此指令后,该类型的任何变量都允许缩放 指针算法和数组索引,即使在指令 类似地,任何被此函数包围的代码块 指令允许对中的任何类型指针进行算术运算 无论键入的指针最初是否为 在指针指向打开时声明

此指令仅影响类型化指针。指针类型的变量 不允许使用指针数学功能,因为类型指针为 有效地指向一个大小为0字节的void元素。 未类型化的var或const参数不受影响,因为它们不受影响 真正的指针


我知道我会很努力地面对手掌,有东西告诉我默认情况下该模式是打开的。我的错。谢谢,我们将尽快接受。此功能是在D2009中引入的。他们可能会默认将其设置为false,以保持与旧版本的兼容性。对于某些类型,此选项处于启用状态。自IIRC、Borland/Turbo Pascal 7开始,PChar(在$X+模式下)一直处于启用状态,自引入$POINTERMATH以来,PByte默认处于启用状态。