C 中的指针数学与 Delphi 中的指针数学

Pointer math in C vs pointer math in Delphi

我必须将以下 C 代码重写为 Delphi:

register short* p;
short k;
int i;

k = p[i];

结果看起来是这样的:

{$POINTERMATH ON}
var
  p: ^SmallInt;
  k: SmallInt;
  i: Integer;
begin
  k := p[i];
end;

现在我有点不确定这里使用的指针数学。

p[i]是否意味着p被占用然后前进了i字节?

或者可能是 p 被采用然后推进 i 16 位字?

我也不确定 Delphi 指针数学语法。逻辑上 Delphi 中的 p[i] 代码应该像 p[i]^ 一样寻找我,但最后一个变体会产生编译器错误 "E2017 Pointer type required".

我的代码转换尝试是否正确?

请注意,我将在下面的答案中使用 i 而不是 d1str + d1st1 作为索引,因为这样可以使说明更清楚。一旦您以这种更简单的形式理解它,就会更容易理解实际代码。

Does p[i] mean that p is taken and then advanced for i bytes?

没有。这意味着,p 被视为指向 short 数组的指针。然后 p[i] 是该数组的第 i 个元素。

p[i] in Delphi code should look for me like p[i]^

没有。 p[i] 是类型 short 的表达式。那不是一个指针,所以你不能对它应用 ^

Is my code conversion attempt correct?

是的。