2012-03-07 14 views
0

私は学校で私に与えられたスレッドライブラリを使用していますが、メソッドへのポインタの配列の参照を渡す方法を理解できないか、ポインタ配列の逆参照および使用。ポインタ配列のポインタを参照しない

私は(Iを信じて)理解の状況はこれです:

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のを、実行中のスレッドを参照することによって、それを渡していますその議論。 MyFunctionはFooポインタに "arg"をキャストし、元のオブジェクトを取得するためにそれを逆参照します。

私が代わりに一つだけの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; 
} 
+0

なぜポインタの 'addressof'を渡していますか? –

+0

参照渡しではありません。オブジェクトへのポインタへのポインタを渡しています。また、なぜあなたは 'void * 'を使っていますか? –

+2

'*(Foo *(*)[3])'しかし、なぜですか? –

答えて

4

ので、アレイ全体に最初の要素へのポインタの代わりにポインタを渡す(MyFunction(barGroup);MyFunction(&barGroup);を交換してください

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

が次にあなたは、単に barGroup[0]barGroup[1]barGroup[2]を使用することができます)とネストされたポインタを使用しています。

+0

私は理解しているかどうかを見てみましょう。 C++の配列はポインタなので、最初の要素へのポインタを渡していますか? キャスティング部分かりません。私はポインタへのポインタにキャストしています、それは私の元のオブジェクトが実際にはポインタへのポインタであるポインタの配列だったからですか? – Ian

+0

**配列はポインタ**ではありませんが、静かにポインタに変換できます。もっと深く掘り下げたい場合は、[FAQ on arrays](http://stackoverflow.com/questions/4810664/)を読んでください。 – fredoverflow

+0

ありがとうございます。よくある質問です。 – Ian

関連する問題