3

我正在研究 delphiXE2,我正在研究 PInteger。如果我在我的德尔福代码中这样做

var
  P: PInteger;
  testInt: Integer;
  Scores: array[0..4] of Integer=(33,44,56,78,78);
begin
  P := @Scores;
  testInt := (P+1)^;
  WriteLn(testInt);
  ReadLn;
end;

我得到了这个错误。

[DCC Error] Project1.dpr(23): E2015 Operator not applicable to this operand type

PS:testInt := (P+1)^;是第23行

但是,当我尝试这个

var
  PCh: PChar;
  testchar: char;
  str: array[0..4] of char=('a','b','c','d','e');
begin
  PCh := @str;
  testchar := (PCh+1)^;
  WriteLn(testchar);
  ReadLn;
end;

它运作良好!控制台可以打印'b'!

我不清楚这怎么会发生,什么时候 ((Pointer)(P)+1)^ 可以工作?

4

3 回答 3

7

指针算法要求编译器知道所指向元素的大小。对于 Pointer 类型的无类型指针,永远不会知道该知识。所以你永远不能用 Pointer 做指针运算。

Delphi 一直支持 AnsiChar 的指针算法。最近添加了一个编译器指令POINTERMATH以启用对所有类型指针的指针运算:http: //blogs.embarcadero.com/abauer/2008/01/24/38852

请注意,该指令启用加法算术运算符和数组索引运算符 []。

因此,如果启用指针算术,则可以对除无类型指针以外的所有指针执行算术运算。否则,仅支持指向字符类型的指针或指向字节的指针。

话虽如此,如果您改为编写 P[1],您的代码会更简洁。显然,这需要启用指针算法。

于 2013-10-22T07:04:55.057 回答
0
var
  P: PInteger;
  testInt: Integer;
  Scores: array [0..4] of Integer = (33, 44, 56, 78, 78);
begin
  P := @Scores[0];
  testInt := PInteger(UINT(P) + SizeOf(Integer))^;
  WriteLn(testInt);
  ReadLn;
end;

您需要使用@Scores[0]来获取数组中的第一个元素。并且要获得数组中的下一个整数,您需要添加SizeOf(Integer)而不是1.

于 2013-10-22T06:30:12.343 回答
0

((Pointer)(P)+1)^ 如果您使用 P[1] 代替,则可以工作。

你可以重写你的代码

var
  P: PIntegerList;
  testInt: Integer;
  Scores: array[0..4] of Integer=(33,44,56,78,78);
begin
  P := @Scores;
  testInt := P^[1];
  WriteLn(testInt);
  ReadLn;
end;

您在这里不需要指针算法(让编译器为您完成他的工作)。

于 2013-10-22T07:09:43.403 回答