关于指针,好迷茫啊,请教大师 ( 积分: 300 )

  • 主题发起人 主题发起人 hotboy
  • 开始时间 开始时间
H

hotboy

Unregistered / Unconfirmed
GUEST, unregistred user!
我在窗体上放两个Edit,检验指针地址。发现下面的几种代码(其实就是是否两个Edit同时显示)结果不一样,对于@P,和P也迷糊。特请大师指点!<br>代码如下:<br>procedure&nbsp;TForm1.Button1Click(Sender:&nbsp;TObject);<br>var&nbsp;P:PInteger;<br>begin<br>Edit1.text:=IntToStr(Integer(@P));//显示1308200<br>Edit2.text:=IntToStr(Integer(P));//显示0<br>end;<br><br>procedure&nbsp;TForm1.Button1Click(Sender:&nbsp;TObject);<br>var&nbsp;P:PInteger;<br>begin<br>Edit1.text:=IntToStr(Integer(P));//显示4358324<br>end;<br><br><br>procedure&nbsp;TForm1.Button1Click(Sender:&nbsp;TObject);<br>var&nbsp;P:PInteger;<br>a:integer;<br>begin<br>&nbsp;&nbsp;&nbsp;&nbsp;a:=10;<br>&nbsp;&nbsp;&nbsp;&nbsp;P:=@a;<br>&nbsp;&nbsp;&nbsp;&nbsp;Edit1.Text:=IntToStr(Integer(@P));//显示1308200<br>&nbsp;&nbsp;&nbsp;Edit2.Text:=IntToStr(Integer(P));//显示1308196<br>end;<br><br><br>procedure&nbsp;TForm1.Button1Click(Sender:&nbsp;TObject);<br>var&nbsp;P:PInteger;<br>a:integer;<br>begin<br>&nbsp;&nbsp;&nbsp;&nbsp;a:=10;<br>&nbsp;&nbsp;&nbsp;&nbsp;P:=@a;<br>&nbsp;&nbsp;&nbsp;Edit2.Text:=IntToStr(Integer(P));//显示1308200<br>end;<br><br>procedure&nbsp;TForm1.Button1Click(Sender:&nbsp;TObject);<br>var&nbsp;P:PInteger;<br>a:integer;<br>begin<br>&nbsp;&nbsp;&nbsp;&nbsp;a:=10;<br>&nbsp;&nbsp;&nbsp;&nbsp;P:=@a;<br>&nbsp;&nbsp;&nbsp;Edit2.Text:=IntToStr(Integer(@P));//显示1308200<br>end;
 
@p应该是取的指针地址<br>p是指指针的内容.
 
@p&nbsp;表示变量p所分配内存起始地址<br>p&nbsp;表示这内存的值<br>procedure&nbsp;TForm1.Button1Click(Sender:&nbsp;TObject);<br>var&nbsp;P:PInteger;<br>begin<br>Edit1.text:=IntToStr(Integer(@P));//显示1308200<br>Edit2.text:=IntToStr(Integer(P));//显示0<br>end;<br>{函数执行时,给变量P分配了4Byte内存,内存起始地址为1308200,此时此分配内存值为零}<br>-----------------------------------------------------------<br>procedure&nbsp;TForm1.Button1Click(Sender:&nbsp;TObject);<br>var&nbsp;P:PInteger;<br>begin<br>Edit1.text:=IntToStr(Integer(P));//显示4358324<br>end;<br>{此时此分配给变量P内存值为4358324,可以看出,对于变量delphi并不是都进行初始化的,所以应该注意对变量进行初始化(就是把这段内存值置零),特别在申请了内存后,有时初始化是必须的}<br>----------------------------------------<br>procedure&nbsp;TForm1.Button1Click(Sender:&nbsp;TObject);<br>var&nbsp;P:PInteger;<br>a:integer;<br>begin<br>&nbsp;&nbsp;&nbsp;&nbsp;a:=10;<br>&nbsp;&nbsp;&nbsp;&nbsp;P:=@a;//P的值是整数a所在内存的起始值<br>&nbsp;&nbsp;&nbsp;&nbsp;Edit1.Text:=IntToStr(Integer(@P));//显示1308200&nbsp;:p所在的内存起始值<br>&nbsp;&nbsp;&nbsp;Edit2.Text:=IntToStr(Integer(P));//显示1308196:&nbsp;P的值=啊所在内存起始值<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Edit3.Text:=IntToStr(P^);//显示10&nbsp;:P^等于&nbsp;p的值所指向的内存的值=a的值<br>end;<br>-------------------------<br>后面两个你觉得奇怪的是&nbsp;显示值相同,那只是因为内存分配并非每次分配一样地址,这个是由系统当时的内存状态决定的
 
同意&nbsp;&nbsp;bmsr&nbsp;的解释
 
后退
顶部