func()
{
Object* pNext;
func1(pNext);
}
func1(Object* pNext)
{
pNext = Segement->GetFirstPara(0);
}
func1() から返された firstpara へのポインターであると予想していましたが、NULL が説明できることと、実際に firstpara() ポインターを返すように修正する方法を見ていますか?
C++ の場合のみ、パラメーターを参照にすることができます
func()
{
Object* pNext;
func1(pNext);
}
func1(Object*& pNext)
{
pNext = Segement->GetFirstPara(0);
}
ここで行われているのは、パラメーターを値で渡す場合と参照で渡す場合の違いです。C は常に値渡しです。値を戻すには、値が参照値である必要があります (たとえば、Object** は Object* をポインターとして参照します)。C++ は参照パラメーターを追加します (& で示されます)。値渡しでは、データのコピーのみが渡され、実際のデータ自体は渡されません。そのため、関数呼び出しで使用される変数が関数内で更新されませんでした。
c では、次のようにします。
func1(&pNext);
func1(Object** pNext) { *pNext = ... }
C++ の場合
func1(pNext);
func1(Object*& pNext) { pNext = ... }
Object*
どちらの言語でも、あなたの例は初期化されていないtoを渡しfunc1
、それをコピーし、コピーに値を割り当ててから返します。元の pNext は変更されないことに注意してください (変数に別の名前を使用した場合に役立ちます)。
どちらの言語でも、値渡しではなく参照渡しが必要な場合は、参照を明示的に渡す必要があります。
ポインターを変更するには、ポインターにポインターを渡す必要がありますObject** pNext
。関数内の変数の値を変更するには、ポインターを渡します。したがって、拡張により、関数内のポインターの値を変更するには、ポインターにポインターを渡します。
func() {
Object* pNext;
func1(&pNext);
}
func1(Object** pNext) { *pNext = Segement->GetFirstPara(0); }
インスタンス化するときは、pNext を初期化してください。デバッグ中は NULL かもしれませんが、フィールドでは 0x12AbD468 か何かになります。次のようなテストがある場合:
if( NULL != pNext )
{
pNext->DoSomething();
}
...そしてあなたのプログラムは爆発し、ユーザーは怒り、サポートに電話し、どうにかして内線番号を取得し、あなたに直接電話して耳を傾けます。
あなたの場合、「func1()」は pNext をパラメーターとして使用しないため、関数から単純に返すことができます。
func()
{
Object *pNext = func1();
}
Object* func1()
{
return Segment->GetFirstPara(0);
}
そのはず
func()
{
Object *pNext;
func1(&pNext);
}
void func1(Object **pNext)
{
*pNext = Segment->GetFirstPara(0);
}