首页 > 解决方案 > C++ 指针比较

问题描述

在 C++ 中如何比较指针?

以下代码中的最后一行显示bc的值不同。但是,b==c返回 true。

#include <iostream>

struct A { int a; };
struct B { int b; };
struct C : A, B { };

int main() {
    auto c = new C();
    B* b = static_cast<B*>(c);
    A* a = static_cast<A*>(c);
    a->a = 1;
    b->b = 2;
    std::cout << c->a << c->b <<"\n";
    std::cout << (a==c) << (b==c) << "\n";
    std::cout << (long)a << "\n" << (long)b << "\n" << (long)c <<"\n";
}

我使用 GCC 和 Clang 收到的示例输出:

12
11
34073632
34073636
34073632

标签: c++pointers

解决方案


不要将指针转换为 long,将它们转换为 intptr_t。

    std::cout << (intptr_t)a << "\n" << (intptr_t)b << "\n" << (intptr_t)c <<"\n";

无论如何,请参阅此定义:

struct C : A, B { };

在内存中看起来像:

{
  A; [sizeof int]
  B; [sizeof int]
}

因为 A 和 B 都是 C 的基类,所以当你这样做时:

    A* a = static_cast<A*>(c);

你会得到一个指向 C 的前 4 个字节的指针。当你这样做时:

    B* b = static_cast<B*>(c);

你得到一个指向 C 的最后 4 个字节的指针,因此有区别。指向 C 类型的指针将始终以这种方式隐式转换指针。


推荐阅读