3
func()
{
    Object* pNext;
    func1(pNext);
}

func1(Object* pNext)
{
    pNext = Segement->GetFirstPara(0);
}

func1() から返された firstpara へのポインターであると予想していましたが、NULL が説明できることと、実際に firstpara() ポインターを返すように修正する方法を見ていますか?

4

5 に答える 5

16

C++ の場合のみ、パラメーターを参照にすることができます

func()
{
    Object* pNext;
    func1(pNext);
}

func1(Object*& pNext)
{
    pNext = Segement->GetFirstPara(0);
}

ここで行われているのは、パラメーターを値で渡す場合と参照で渡す場合の違いです。C は常に値渡しです。値を戻すには、値が参照値である必要があります (たとえば、Object** は Object* をポインターとして参照します)。C++ は参照パラメーターを追加します (& で示されます)。値渡しでは、データのコピーのみが渡され、実際のデータ自体は渡されません。そのため、関数呼び出しで使用される変数が関数内で更新されませんでした。

于 2008-10-11T00:24:54.940 に答える
5

c では、次のようにします。

func1(&pNext);
func1(Object** pNext) { *pNext = ... }

C++ の場合

func1(pNext);
func1(Object*& pNext) { pNext = ... }

Object*どちらの言語でも、あなたの例は初期化されていないtoを渡しfunc1、それをコピーし、コピーに値を割り当ててから返します。元の pNext は変更されないことに注意してください (変数に別の名前を使用した場合に役立ちます)。

どちらの言語でも、値渡しではなく参照渡しが必要な場合は、参照を明示的に渡す必要があります。

于 2008-10-11T00:21:42.027 に答える
4

ポインターを変更するには、ポインターにポインターを渡す必要がありますObject** pNext。関数内の変数の値を変更するには、ポインターを渡します。したがって、拡張により、関数内のポインターの値を変更するには、ポインターにポインターを渡します。

func() { 
    Object* pNext;
    func1(&pNext);
}

func1(Object** pNext) { *pNext = Segement->GetFirstPara(0); }
于 2008-10-11T00:19:29.677 に答える
1

インスタンス化するときは、pNext を初期化してください。デバッグ中は NULL かもしれませんが、フィールドでは 0x12AbD468 か何かになります。次のようなテストがある場合:

if( NULL != pNext )
{
  pNext->DoSomething();
}

...そしてあなたのプログラムは爆発し、ユーザーは怒り、サポートに電話し、どうにかして内線番号を取得し、あなたに直接電話して耳を傾けます。

あなたの場合、「func1()」は pNext をパラメーターとして使用しないため、関数から単純に返すことができます。

func()
{
  Object *pNext = func1();
}

Object* func1()
{
  return Segment->GetFirstPara(0);
}
于 2008-10-11T12:50:47.070 に答える
0

そのはず


func()
{
  Object *pNext;
  func1(&pNext);
}

void func1(Object **pNext)
{
  *pNext = Segment->GetFirstPara(0);
}
于 2008-10-11T00:21:22.933 に答える