c++ - C++ 指针比较
问题描述
在 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 类型的指针将始终以这种方式隐式转换指针。
推荐阅读
- r - 在R中提取国家名称
- python - 在单循环方法中测试一组节点的可用性
- c++ - 输入和输出迭代器是可交换的?
- javascript - encodeURIComponent 不对 HTML 数据属性中的换行符进行编码
- .net - dotnet 使用 ftp Github Actions 发布和部署
- javascript - AngularJS 的资源文件没有提供正确的编码字符串
- python - 正则表达式返回零长度匹配的标点符号?
- hyperledger-fabric - 我们可以在用户注册时在超级账本结构中提供自定义密码而不是注册密码吗
- c# - openid connect owin 如何验证来自 Azure AD 的令牌?
- javascript - 在添加的新文件上运行的 Cronjob