【问题标题】:Comparing pointer object equality比较指针对象相等性
【发布时间】:2015-01-18 14:56:16
【问题描述】:

处理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。现在,一切正常,但这两个指针根本不是同一个对象。这里的问题是关于是否有办法检查 POINTER 是否相等。现在,我知道我可以创建一个指向这些指针的指针,然后将这些新指针与== 进行比较,如下所示

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

,这不会产生到控制台的输出,但我想知道是否有办法直接比较指针地址。我确实知道这有点用处(至少基于我目前对 C 编程语言和需求的理解),但我仍然想知道 C(或 C++)中是否存在这样的功能。

【问题讨论】:

  • 结构声明不是有效的 c 代码,除非你有以前的 typedef typedef struct qwe qwe;
  • but these two pointers are not the same objects at all 应该是什么意思?
  • 我忘了说已经完成了。谢谢指正。
  • @iharob 他们确实指向同一个对象,但它们本身并不是同一个对象。
  • 您想测试身份。最简单的方法是像您所做的那样,获取对象的地址。 &p == &(p->ptr)。是否处理指针真的无关紧要。

标签: c++ c pointers reference


【解决方案1】:

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");

【讨论】:

  • 你只是用不同的话告诉了我:/如果两个指针具有相同的值,它们指向内存中的同一个对象(也就是同一个内存地址),正如我上面提到的。
【解决方案2】:

任何变量都可以通过其地址唯一标识。

地址是通过将地址运算符&应用于变量来计算的。

所以你的例子比较值

p == p->ptr

然后看起来像

&p == &p->ptr

比较指针实例的相等性。

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

【讨论】:

    猜你喜欢
    • 2017-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多