我正在研究delphiXE2,我正在研究PInteger。 如果我在我的delphi代码中这样做
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'!
我不清楚这是怎么发生的,什么时候((指针)(P)+1)^可以工作?
答案 0 :(得分:7)
指针算法要求编译器知道指向的元素的大小。对于类型为Pointer的无类型指针,该知识永远不会被人知道。所以你永远不能用指针进行指针运算。
Delphi一直支持AnsiChar的指针算法。最近添加了编译器指令POINTERMATH,以便对所有类型指针启用指针算法:http://blogs.embarcadero.com/abauer/2008/01/24/38852
请注意,该指令启用了加法或算术运算符以及数组索引运算符[]。
因此,如果启用指针运算,则可以对除非类型指针之外的所有指针执行算术运算。否则,它仅支持指向字符类型或指向字节的指针。
话虽如此,如果您编写P [1],您的代码会更清晰。显然,这需要启用指针算法。
答案 1 :(得分: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
。
答案 2 :(得分:0)
((指针)(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;
这里你不需要指针arythmetic(让编译器为你完成他的工作)。