procedure TForm1.Button1Click(Sender: TObject);
var
  pI : pinteger;
  arrB:array[0..7]of integer;
begin
  arrB[0]:=888;
  arrB[1]:=777;
  arrB[2]:=444;
  arrB[3]:=333;
  arrB[4]:=222;
  pI := @arrB[0];  ShowMessage(IntToStr(Pi^)); // 888
  ShowMessage(IntToHex(Integer(Pi), 8));  //0012F528  ShowMessage(IntToStr( Pinteger(Integer(Pi)+4)^  ));  // 777
  ShowMessage(IntToStr( Pinteger(Integer(Pi)+4*sizeof(Integer))^  )); // 222  Inc(pI,4);  ShowMessage(IntToStr(Pi^)); // 222
  ShowMessage(IntToHex(Integer(Pi), 8));  //0012F538
end;

解决方案 »

  1.   

    //Inc(pinteger(i), 4); //为什么这里要强制转换下,本身就是integer类型的?不用强制转换edit1.Text:=inttostr((i+4)^); //这样为什么不行?i 是指针 4 是int  怎么能加???
    integer(i) 就是他的地址
      

  2.   

    Delphi的指针和C 一样  几乎没区别http://tieba.baidu.com/p/262852532
      

  3.   

      //Inc(pinteger(i), 4); //为什么这里要强制转换下,本身就是integer类型的?
      edit1.Text:=inttostr((i+4)^); //这样为什么不行?delphi对指针类型要求比较严格, 如果是无类型指针便宜, 则必须强制转换指针类型
    Inc(pinteger(i), 4) <==> pinteger(integer(i) + 4 * sizeof(integer));
      

  4.   

    《Delphi In A NUTSHELL》 -p15指针(Pointer)在delphi不如在c\c++中那么重要,delphi具有真正意义上的数组,故没有必要用指针来模拟数组。delphi对象使用它们自身的语法,因为不需要用指针来引用对象。pascal也具有真正的引用传递参数。delphi中指针最普遍的应用是与c\c++代码的接口,包括win api。比起与pascal类似来,c\c++程序员更愿意delphi对指针使用的规则与c类似。尤其是对指针的类型检查比其他类型要宽松得多。(参见第八章的$T 和$TypeAddress 预编译指令,他们似的规则变得更严格。)Pointer 类型是一个普通的指针类型,与c\c++的 void*等价。当你把一个指针分配给一个Pointer类型变量,或者分一个Pointer类型表达式给一个指针变量时,你并不需要使用强制类型转换。为了获取一个变量或例程的地址,可使用addr或@(等价于c\c++中的&)。当使用一个指针来存取一个数组记录的元素时,可以忽略操作符(^)。delphi 可以判断该引用使用了指针,并自动支持 ^ 操作符。可以用一种比c\c++中稍微受限制的方式来对指针进行运算,使用Inc和Dec语句,讲指针值向前或向后移动特定数目的基类型元素,实际指针值则根据指针基类型的大小而改变。例如,对一个 Integer 指针的增量使它增加了4个字节:var
      intPtr: ^integer;
    begin
      Inc(IntPtr);//使 IntPtr 指向下一个Integer,4个字节之后
      Inc(intPtr,3);//将 IntPtr 增加了 3 * sizeof(integer)) = 12 字节
    end;