在C++中如何比较指针?
以下代码中的最后一行显示b
和c
的值不同。但是,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类型的指针将始终以这种方式隐式强制转换指针。