delphi指针有关问题,寻爱Delphi的人

delphi指针问题,寻爱Delphi的人。
function ft(obj:pinteger):integer;//这里的参数接收数组的首地址或对象指针这样填标准吗?
begin

     result:=(pinteger(obj)+1)^;   //这里如果要返回数组的某个元素应该怎么写?先不计是否是全局变量。
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i : pinteger;
  b:array[0..7]of integer;
  int:integer;
begin
  b[0]:=888;
  b[1]:=777;
  b[2]:=444;
  b[3]:=333;
  b[4]:=222;
  i:=@b[0];
  //Inc(pinteger(i), 4); //为什么这里要强制转换下,本身就是integer类型的?
  edit1.Text:=inttostr((i+4)^); //这样为什么不行?
  //edint1.text:=inttostr(i);//如何输出指针里存放的地址?
   ft(i);
end;
end.

问题如上注释,愿详细回答,纠结了多天了。第一次发帖,分不多请多包涵。
delphi,pscal都没有书全面的讲语法类型之类的,如类似c primer plus的书,这么好的语言,唉。

------解决方案--------------------

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;


------解决方案--------------------
  //Inc(pinteger(i), 4); //为什么这里要强制转换下,本身就是integer类型的?
  edit1.Text:=inttostr((i+4)^); //这样为什么不行?

delphi对指针类型要求比较严格, 如果是无类型指针便宜, 则必须强制转换指针类型
Inc(pinteger(i), 4) <==> pinteger(integer(i) + 4 * sizeof(integer));

------解决方案--------------------
《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;