比较指针对象相等性

4

在处理C语言(有时候是C++)中的指针时,我遇到了一个有趣的例子:假设我们有一个如下所示的结构体(C结构体):

struct qwe
{
    int someData;
    qwe *ptr;
}

然后是一些代码:

struct qwe d, *p = &d;
p->someData = 1;
p->ptr = p;

我明白这些指针指向同一个对象,根据语言规范中==的定义,使用该运算符如下:

if (p == p->ptr)
    printf("True\n");

这将在控制台窗口中打印True。虽然如此,这两个指针其实并不是同一个对象。问题在于是否有办法检查指针的等价性。我知道可以通过创建一个指向这些指针的指针,然后使用==比较这些新指针来实现。

struct qwe** pToPtr_1 = &p;
struct qwe** pToPtr_2 = &(p->ptr);
if (pToPtr_1 == pToPtr_2)
    printf("True\n");

这段代码不会在控制台上输出任何内容,但我想知道是否有一种直接比较指针地址的方法。我理解这可能有点无用(至少基于我当前对C编程语言和需求的理解),但我仍然想知道C(或C ++)是否存在这样的功能。


结构声明不是有效的C代码,除非您有先前的typedeftypedef struct qwe qwe; - Iharob Al Asimi
1
“但是这两个指针根本不是同一个对象” 这句话的意思是什么? - Iharob Al Asimi
1
@iharob 好吧,它们确实指向同一个对象,但它们本身不是同一个对象。 - Transcendental
5
您想测试身份(identity)。最简单的方法就像您所做的那样,通过获取对象的地址来进行比较。&p == &(p->ptr)。无论是否涉及指针都并不重要。 - Joseph Mansfield
是的,我明白你的意思... - Iharob Al Asimi
显示剩余5条评论
2个回答

9

tl;dr: 没有更“直接”的方法了;你已经合理地比较了两个指针的标识,使用了语言提供的工具。

你所询问的不是相等性而是标识性。你想要看到两个对象实际上是同一个对象,占据内存空间,这与具有相同值的两个分离对象是不同的。

如你所述,可以通过比较指向它们的指针来检查两个对象的标识。你正在比较地址。当地址相同时,实际上只有一个对象。

对于指针,同样的方法也适用,因为它们本身就是对象。你已经在你的答案中编写了执行此操作的代码:

struct qwe** pToPtr_1 = &p;
struct qwe** pToPtr_2 = &(p->ptr);
if (pToPtr_1 == pToPtr_2)
    printf("True\n");

您可以通过避免声明来缩短它:
if (&p == &p->ptr)
   printf("True\n");

你只是用不同的措辞重复了我所说的:/ 如果两个指针具有相同的值,则它们指向内存中的同一对象(也称为相同的内存地址),正如我上面所提到的。 - ilgaar

5
任何变量都可以通过其地址唯一地识别。
通过将地址运算符 & 应用于变量来计算地址。
因此,您的示例比较值。
p == p->ptr

那么看起来会像这样:
&p == &p->ptr

比较指针实例的相等性。

注意:该方法不仅限于指针,还可应用于任何数据类型的变量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接