You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 20:28:10