指针 ( 积分: 20 )

  • 主题发起人 主题发起人 oer_2001
  • 开始时间 开始时间
O

oer_2001

Unregistered / Unconfirmed
GUEST, unregistred user!
var b: string;

procedure TForm1.FormCreate(Sender: TObject);
begin
b := '123';
end;

procedure TForm1.Button2Click(Sender: TObject);
var i: integer;
p: Pointer;
begin
i := Integer(b);//$00ce258c
p := @b;//00455c00
if p = nil then
;
if i = 0 then
;
end;
上面的两个直(i,p)为什么不一样?
现在知道了一个地址p,怎么返回地址P中的值,aa := p^ 不行
 
var b: string;

procedure TForm1.FormCreate(Sender: TObject);
begin
b := '123';
end;

procedure TForm1.Button2Click(Sender: TObject);
var i: integer;
p: Pointer;
begin
i := Integer(b);//$00ce258c
p := @b;//00455c00
if p = nil then
;
if i = 0 then
;
end;
上面的两个直(i,p)为什么不一样?
现在知道了一个地址p,怎么返回地址P中的值,aa := p^ 不行
 
i := Integer(b);
p := Pointer(b);
if p <&gt
nil then
if I = Integer(P) then
caption := IntTOstr(Integer(p));
Button2.Caption := IntTostr(I);
 
i := Integer(b)
// 这个不是指针,是将b的内容作为整型赋值给i, 因为b是字符串,存放格式与整型完全不同,所以就按整型取4个字节。
p := @b
// 这个是指针,将变量b的地址赋值给p。

aa:=Integer(p^)
// 这样取值可以。因为p是无类型的指针,所以取值要麻烦点。
 
b:='123'

i := Integer(b);//$00ce258c
p := @b;//00455c00

i、p 都是内存地址,string是一个4字节的类型,他的内容其实就是一个指针,指向一个不定长度的字符串,i的值表示的地址指向的内存就是存放了'123'这个字符串,以字节0结尾,字符串长度(3)放在了i-4指向的位置,是个integer类型
p是指向一个string结构,就是 00455c00 内存放的是四个字节的地址 00ce258c
00ce258c地址放的是字符串'123'
 
可能楼主对概念性的东西没有弄明白,简单的说,指针就是存储变量的变量,指针是一种特殊类型的变量,通过指针可以间接访问变量,指针运算可以快速的访问内存中的变量,这样效率很高,Delphi的指针类型较C语言讲还是有些弱的,至于怎么用还是需要多看一些代码和自己摸索。
下面简单的介绍一下指针的使用,例如:
var
myP : Pointer;//无类型指针;
MyInt : Integer;
begin
MyInt := 3;
myP := @MyInt
//取出MyInt地址赋给myP;
showmessage(inttostr(MyInt));//先是MyInt的值
//如果想通过指针修改变量的值,可以使用"^"
Integer(myP^) := 5
//必须转换成Integer类型的指针
showmessage(inttostr(MyInt));
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
P:Pointer;
I,J:Integer;
PP:Pchar;
begin
I:=Integer(B);
P:=Pointer(I);
showmessage(String(P));
PP:=pchar(B);
showmessage(PP);
end;
 

Similar threads

A
回复
0
查看
994
Andreas Hausladen
A
S
回复
0
查看
702
SUNSTONE的Delphi笔记
S
S
回复
0
查看
697
SUNSTONE的Delphi笔记
S
S
回复
0
查看
908
SUNSTONE的Delphi笔记
S
S
回复
0
查看
885
SUNSTONE的Delphi笔记
S
后退
顶部