C++指针比较

C++ Pointer Comparison

本文关键字:比较 指针 C++      更新时间:2023-10-16

在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

不要将指针强制转换为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类型的指针将始终以这种方式隐式强制转换指针。