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的书,这么好的语言,唉。
------解决方案--------------------
------解决方案--------------------
//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;
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;