【问题标题】:De-referencing void pointer to a pointer array取消引用指向指针数组的 void 指针
【发布时间】:2012-03-25 09:23:36
【问题描述】:

我正在使用学校给我的线程库,并且无法理解如何将指针数组的引用传递给方法,或者更确切地说,我在取消引用和使用指针数组时遇到了麻烦。

我(相信我)理解的情况是这样的:

int main(void)
{
    Foo* bar = new Foo();

    // Passing instance of Foo pointer by reference 
    CThread *myThread = new CThread(MyFunction, ACTIVE, &bar);

    return 0;
}

UINT __stdcall MyFunction(void *arg)
{
    Foo* bar = *(Foo*)(arg); 

    return 0;
}

我正在创建一个指向 Foo 对象的指针,并通过引用将其传递给运行 MyFunction 的线程,该线程接受一个 void 指针作为其参数。 MyFunction 然后将“arg”转换为 Foo 指针并取消引用它以获取原始对象。

当我想传递一个 Foo 指针数组而不是一个指针时,我的问题就出现了:

int main(void)
{
    Foo* barGroup[3] = 
    {
        new Foo(),
        new Foo(),
        new Foo()
    };

    // Passing instance of Foo pointer by reference 
    CThread *myThread = new CThread(MyFunction, ACTIVE, &barGroup);

    return 0;
}

UINT __stdcall MyFunction(void *arg)
{
    // This is wrong; how do I do this??
    Foo* barGroup[3] = *(Foo[]*)(arg); 

    return 0;
}

【问题讨论】:

  • 你为什么要传递addressof一个指针?
  • 你不是通过引用传递的。您正在传递一个指向对象指针的指针。还有,你为什么用void*
  • *(Foo*(*)[3]) 但是为什么呢?
  • 像这样使用 void*s,而且几乎在所有情况下,都是非常糟糕的做法。
  • 你为什么用void*而不是真正的类型?

标签: c++ pointers void-pointers


【解决方案1】:

MyFunction(&barGroup); 替换为MyFunction(barGroup);(从而传递指向第一个元素的指针而不是指向整个数组的指针)并使用嵌套指针:

Foo** barGroup = (Foo**)(arg); 

那么你可以简单地使用barGroup[0]barGroup[1]barGroup[2]

【讨论】:

  • 所以让我们看看我是否理解;我正在传递一个指向第一个元素的指针,因为 C++ 中的数组是指针?铸造部分我不太了解。我正在转换为指向指针的指针,是不是因为我的原始对象是一个指针数组,实际上是一个指向指针的指针?
  • 数组不是指针,但它们可以默默地转换为指针。如果您想深入了解,请阅读我们的FAQ on arrays
  • 谢谢,FAQ 看起来很有帮助!
猜你喜欢
  • 2011-10-20
  • 1970-01-01
  • 1970-01-01
  • 2015-01-04
  • 2021-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多