所以根据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类似,那么有人可以提供一个有效的例子吗?
答案 0 :(得分:3)
在Delphi中,您必须启用特殊的编译器模式才能将指针视为指向数组的指针。使用POINTERMATH
指令启用该模式,如下所示:
{$POINTERMATH ON}
来自文档:
指针数学只是简单地处理任何给定的类型指针 实例作为缩放序数,您可以在其中执行简单的算术运算 直接对指针变量进行操作。它也允许你 使用数组[]将这样的指针变量视为无界数组 运营商。请注意,在上面的示例中,递增索引 一个类型的数组相当于将指针递增到该数组 类型。增量为1会使指针按数组大小进行碰撞 元素以字节为单位,而不是一个字节。
POINTERMATH指令具有本地范围。也就是说,如果你转过来 指令ON并且不在模块中将其关闭,它将保持打开状态 直到模块结束。此外,如果您声明一个类型指针 使用此指令ON,该类型的任何变量都允许缩放 指针算术和数组索引,即使在指令之后也是如此 已关闭同样,任何代码块都被此包围 指令允许对任何类型指针进行算术运算 块,无论键入的指针是否最初 用POINTERMATH ON声明。
此指令仅影响键入的指针。指针类型的变量 不允许指针数学功能,因为类型指针是 有效地指向void元素,其大小为0字节。 未输入的var或const参数不受影响,因为它们不受影响 真指示。