如何保存一个指针地址,以便另一个指针可以继续工作?

Posted

技术标签:

【中文标题】如何保存一个指针地址,以便另一个指针可以继续工作?【英文标题】:How to save a pointer address, so that another pointer can continue working on it? 【发布时间】:2018-04-13 08:18:03 【问题描述】:

有没有办法将指针的地址存储到任意变量中(例如int)并再次使用该变量来分配第二个指针的地址?

我知道你可以轻松做到

int* p1;
int* p2;
p2 = p1;

我要找的是这样的

int* p1;
int* p2;
long addr_p1 = (long)p1;
p2 = doMagicCast(addr_p1);

感谢您的建议

【问题讨论】:

为什么你的 addr_p1 必须很长?为什么不能是 int*? 您在寻找std::uintptr_t吗?虽然如此,存储指针地址是相当冒险的事情,你应该解释为什么你需要这个 doMagicCast 实际上就是(int*)。这将编译但不能保证工作,因为指针的大小可能与long 的大小不同。还要考虑前面的两个 cmets。 我完全不清楚你想做什么。您是否正在寻找void* @iBug 实际上应该使用reinterpret_caststatic_cast 限制太多,无法编译。 【参考方案1】:

这是正确的 C++ 方式:

#include <cinttypes>

int main() 
  int* p1;
  int* p2;
  std::uintptr_t addr_p1 = reinterpret_cast<std::uintptr_t>(p1);
  p2 = reinterpret_cast<int*>(addr_p1);

您需要使用std::uintptr_t 而不是long,因为不能保证long 可以保存指针。

但在 32 位平台(long 和指针通常有 32 位)上,您使用 long 的初始方法可能有效。

【讨论】:

谢谢我不知道long-问题。为什么这样做有风险?想象一下,我可以 100% 确保地址和此范围内的所有内容都不会被这两个指针之外的任何不同的东西触发 - 我是否必须期望偶尔会受到程序外部的影响?还是只是编码不好? 这只是糟糕的编码。在 32 位平台上,uintptr_t 通常是 typedef unsigned int uintptr_t;,因此您的带有 long 的代码肯定可以在 32 位平台上运行。但是,当您将来某个时候将 32 位应用程序迁移到 64 位世界时,您会后悔使用 long 而不是 std::uintptr_t 就是这样,亲切的问候

以上是关于如何保存一个指针地址,以便另一个指针可以继续工作?的主要内容,如果未能解决你的问题,请参考以下文章

如何将一个指针指向的地址存储到另一个指针?

作业十总结

作业10总结

保存数组地址的指针的地址如何相同?

void*指针

如何取指针变量的地址?