【问题标题】:How to get the address of a value, pointed to by a pointer如何获取指针指向的值的地址
【发布时间】:2009-06-03 12:08:01
【问题描述】:

我有一个指向 int 的指针。

int index = 3;
int * index_ptr = &index;

index_ptr 是类IndexHandler 的成员变量。

A 类有一个 IndexHandlers 的 std::vector,Avector。 B 类有一个指向 IndexHandlers 的指针的 std::vector,Bvector,我将它设置为指向 A 类向量中的项目,因此:

Bvector.push_back(Avector[i].GetPtr())

到目前为止还和我在一起?

我想检查当我解析 Bvector 中的指针并检索内部 IndexHandlers index_ptr 时,它们是否指向与 A 类相同的 index_ptr...

如何检查它们是否指向相同的内存地址?... 如何打印两组指针所指向的值的地址?

【问题讨论】:

标签: c++ pointers


【解决方案1】:

要打印 int 指针的地址和 int 指针指向的 int 值,请使用

printf("%p %i\n", ptr, *ptr);

【讨论】:

  • 如果您不喜欢十六进制格式,您也可以使用 %d、%i 或其他任何方式来格式化它。但是, %p 似乎是“正确的方法”,因为它没有给出编译器警告(使用 gcc 和 -Wall)。
  • 是的,我需要十六进制,所以我一直使用 %X
【解决方案2】:

将它们并排打印出来的非迭代器方法:

for (size_t i = 0; i < Avector.size(); i++)
{
  std::cout << "Avector ptr:" << Avector[i].GetPtr() << ", Bvector ptr:" << Bvector[i] << std::endl;
}

这将打印出每个指针的值。

不过,您应该注意一件事。如果 IndexHandler 中的指针指向 IndexHandler 中的值,那么如果调整向量的大小,它可能会失效,并且如果在该索引处插入或删除项目,则指向索引上方任何内容的指针将失效。正因为如此,将指向向量中的项的指针保留通常是一个坏主意,如果您想这样做,那么最好使用 std::list 容器代替(这不会使指向列表中项的指针无效)您插入或删除新值)

【讨论】:

  • 除了 Bvecotr[i] 实际上是一个 IndexHandler*... 所以我需要输入 Bvector[i]-&gt;GetPtr() 对吗?
【解决方案3】:

我如何检查他们指向 相同的内存地址?

if (index_ptr1 == index_ptr2)
{
  // They point to the same address
}
else
{
  // They don't
}

【讨论】:

    【解决方案4】:

    一个非常“C”的方法是使用 printf。像这样:

    printf("A = %p, B = %p", (void *)A, (void *)B);
    

    以上假设 A 和 B 是指针类型。

    【讨论】:

    • %p 已经打印了一个 0x 所以在这种情况下你会得到双 0x 前缀。
    • (在我见过的大多数实现中。标准说它是特定于实现的格式。)
    • 好的,我改一下答案。我没有意识到不同版本的 printf 做了不同的事情。
    【解决方案5】:

    类内部:

    //from this to uint value
    void*   me=(void*)this;
    uint* me_pAddress=(uint*)&me;
    uint ThisAddress=*me_pAddress; //address value of 'this' pointer
    
    //from uint value to this pointer
    void*** me_ppAddress=(void***)&ThisAddress;
    myClass* thisPointer=(myClass* )(*me_ppAddress);
    thisPointer->myFunction();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多