如何在Delphi中将Byte数组转换为PByte?

ala*_*ncc 1 arrays delphi pointers delphi-5

我正在使用Delphi5。我定义了一个字节数组,如下所示:

Buffer: Array of BYTE;
Run Code Online (Sandbox Code Playgroud)

如何将其转换为PByte指针?

Dav*_*nan 6

有两种方法可以做到这一点:

var
  P: PByte;
....
P := @Buffer[0]; // no cast, compiler can check type safety
P := PByte(Buffer); // implementation detail, dynamic array variable is pointer to first element
Run Code Online (Sandbox Code Playgroud)

请注意,如果启用了范围检查并且数组为空,则前者会导致范围错误。因此,我倾向于后者,尽管您可能会因为缺乏类型安全性而批评直接指针转换。

  • 我回滚了问题。您最初询问的是*动态数组*。但是,您的编辑谈论的是“开放数组”。这些是完全不同的事情,因此我回滚了编辑,因为在您得到两个答案后更改问题为时已晚。但是,对于开放数组,您必须使用`@Buffer [0]`。 (2认同)

Rem*_*eau 6

动态数组被实现为指针,因此您可以按原样键入它:

var
  Buffer: array of Byte;
  P: PByte;
begin
  SetLength(Buffer, ...);
  P := PByte(Buffer);
  ...
end;
Run Code Online (Sandbox Code Playgroud)

如果您不想依赖于此实现细节,则可以改用数组中第一个字节的内存地址:

P := @Buffer[0];
Run Code Online (Sandbox Code Playgroud)