有关指针的疑问??(10分)

  • 主题发起人 主题发起人 AKang
  • 开始时间 开始时间
A

AKang

Unregistered / Unconfirmed
GUEST, unregistred user!
程序段如下:<br>procedure TForm1.Button1Click(Sender: TObject);<br>var<br>&nbsp; I:Integer;<br>&nbsp; Pi:^Integer;<br>begin<br>&nbsp; I:=10;<br>&nbsp; showmessage(format('%p',[@i]));<br>&nbsp; Pi:=Ptr($68f370);<br>&nbsp; Pi^:=5;<br>&nbsp; showmessage(IntToStr(I));<br>end;<br>说明:<br>这个程序是这样,我首先用showmessage得出I的地址,如我的程序中测试得出的是$68f370,然后加上showmessage后面的语句。<br>疑问如下:<br>1.如上面,如果我后来不用第一个showmessage语句,程序会出错。<br>2.如果我在按钮上按回车键,第二个showmessage语句等出的是10,但如果用鼠标按,又得出我所期望的值5.<br><br>这个程序我只为测试,但上面的问题,真令人困惑,请高手赐教!!
 
怎么我的测试没有问题?你有没有改变Delphi的编译选项?
 
//如此更改<br>//回车和鼠标按键所分配的地址不同<br><br>procedure TForm1.Button2Click(Sender: TObject);<br>var<br>&nbsp; I:Integer;<br>&nbsp; Pi:^Integer;<br>begin<br>&nbsp; I:=10;<br>&nbsp; showmessage(format('%p',[@i]));<br>&nbsp; Pi:=@i;<br>&nbsp; Pi^:=5;<br>&nbsp; showmessage(IntToStr(I));<br>end;<br><br>
 
to AKang:<br><br>1.不用第一个SHOWMESSAGE()当然出错,你还没有给I 负指针呢。<br>&nbsp; &nbsp; @ 操作符返回变量的地址, 也就是为他的操作数附地址值。<br>&nbsp; &nbsp;在showmessage里,虽然作为参数传递,但同时也做了@操作。<br>2. 同意:Shao.K。
 
1, 每一次运行,i 可能不一样,<br>&nbsp; &nbsp; @是取地址操作,不会对 i 有改变。<br>2, 不知道,<br><br>最好别在 delphi 中这样,错了都不知道什么错。
 
I是处于堆栈中,按回车和按鼠标程序的经过不同,使用堆栈也不同,$68f370只是<br>某种情况下i处于的地址,改变了程序的执行,堆栈的使用就不同,$68f370就不是<br>你想象的地方了
 
Pipi 终于又来了。呵呵,这一下,沈前卫当不了第一了。
 
I是一个局部变量,每次运行该过程重新分配I的地址,不管鼠标还是回车都有可能改变,<br>第一次运行得到的地址第二次就不一定是同一个地址了. 如果改写成下面的方法就不<br>会出问题了.<br><br>Pi:=Ptr($68f370);Pi^:=5; 如此赋值给一个指定地址可能导致其他程序瘫痪,除非<br>你确定地知道该地址指向的是什么东西.<br><br>procedure TForm1.Button1Click(Sender: TObject);<br>var<br>&nbsp; I:Integer;<br>&nbsp; Pi:^Integer;<br>&nbsp; PL: longint;<br>begin<br>&nbsp; I:=10;<br>&nbsp; PL := Longint(@i);<br>&nbsp; Pi:=Ptr(PL);<br>&nbsp; Pi^:=5;<br>&nbsp; showmessage(IntToStr(I));<br>end;<br>
 
多人接受答案了。
 
后退
顶部