我正在尝试将数组转换为指针,以便添加第一个和第二个元素。然而,这仅适用于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.
答案 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;