如何正确转换数组指针?

时间:2015-10-24 13:07:44

标签: delphi delphi-xe8

我正在尝试将数组转换为指针,以便添加第一个和第二个元素。然而,这仅适用于32位而不是64位?为什么呢?

procedure Add(const A, B: Pointer);
var
  I, J: Integer;
begin
  I := PInteger(@A)^;
  J := PInteger(@B)^;
  WriteLn(I + J);
end;

procedure Test(const A);
begin
  Add(PPointer(@A)[0], PPointer(@A)[1]);
end;

var
  A: Array of Integer;
begin
  SetLength(A, 2);
  A[0] := 2;
  A[1] := 4;

  Test(A[0]);

  // 32 bit compiler prints 6!
  // 64 bit compiler prints 2!

  ReadLn;
end.

1 个答案:

答案 0 :(得分:1)

指针的宽度为32或64位,具体取决于平台。 Integer总是32字节宽。而不是强制转换为PPointer施放到PInteger

你真的希望尽可能避免施法,因为你失去了类型安全。因此,你的代码有太多的间接性,而且只是巧合。也许你想做这样的事情:

procedure Add(A, B: Pointer);
begin
  WriteLn(PInteger(A)^ + PInteger(B)^);
end;

procedure Test(const A);
var
  P: PInteger;
begin
  P := PInteger(@A);
  Add(@P[0], @P[1]);
end;

或者

procedure Add(A, B: Pointer);
begin
  WriteLn(PInteger(A)^ + PInteger(B)^);
end;

procedure Test(const A);
var
  P: PInteger;
begin
  P := PInteger(@A);
  Add(P, P + 1);
end;