Delphi中如何判断两个指针指向同一内存地址?
如何判断两个指针是否指向同一内存地址(Delphi)
嗨,我来帮你理清这个问题~首先咱们得先搞懂你当前代码返回false的核心原因:
你的代码里,p1 := @self是取self这个隐含局部变量自身的内存地址,p2 := @tmp是取tmp这个自定义局部变量自身的内存地址——这俩是完全不同的局部变量,内存位置自然不一样,所以比较结果是false,但这并不是你真正想要的(你想比较的是它们指向的对象地址)。
正确的实现方式
在Delphi中,对象引用本身就是指向对象实例的指针。如果你想判断两个引用是否指向同一个对象(也就是同一内存地址),有两种简单直接的方式:
方式1:直接比较对象引用
因为对象引用本质上就是指针,直接比较两个引用变量即可:
procedure TForm2.btnTestClick(Sender: TObject); var tmp : TObject; begin tmp := self; if tmp = self then ShowMessage('true') else ShowMessage('false'); end;
方式2:显式转换为Pointer后比较
如果你需要用Pointer类型来做比较,直接把对象引用转成Pointer即可(别用@操作符,@操作符是取变量本身的地址,不是变量存储的指针值):
procedure TForm2.btnTestClick(Sender: TObject); var tmp : TObject; p1,p2 : Pointer; begin tmp := self; p1 := Pointer(self); // 获取self指向的对象实例地址 p2 := Pointer(tmp); // 获取tmp指向的对象实例地址 if p1 = p2 then ShowMessage('true') else ShowMessage('false'); end;
关键知识点提醒
- 在Delphi中,
@变量名的作用是获取该变量自身在内存中的存储地址,而不是变量里面存储的指针值。 - 对象引用(比如
self、tmp)本身存储的就是对象实例的内存地址,所以直接比较引用或者转成Pointer后比较,就能准确判断是否指向同一内存地址。
内容的提问来源于stack exchange,提问作者White
相关产品推荐
相关产品推荐

