English 中文(简体)
以下情况下使用 C,pNext 指针将是什么?
原标题:
  • 时间:2008-10-11 00:13:32
  •  标签:
func()
{
    Object* pNext;
    func1(pNext);
}

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

我本以为它会是从func1()返回的第一个段落的指针,但我看到的是NULL,可以有人解释一下,并告诉我如何修复以实际返回firstpara()指针吗?

问题回答

仅适用于C ++,您可以将参数设为引用。

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

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

What is going on here is the difference between passing parameters by value and passing by reference. C always passes by value. In order to get a value back, the value needs to be a reference value (e.g. Object** refers to Object* as a pointer). C++ adds reference parameters (signified by the &). Pass by value only passes a copy of the data and never the actual data itself. That is why the variable used in the function call was not updated in the function.

在C语言中,您想要:

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

在C++中

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

无论使用哪种语言,你的示例都会将未初始化的Object*传递给func1,它将复制它,为副本分配一个值,然后返回。请注意,原始pNext从未被修改(如果您使用不同的变量名称将有所帮助)。

在两种语言中,如果想要传递引用而不是传值,则需要显式传递引用。

要更改指针,您需要传递指向指针的指针,即 Object ** pNext 。 要更改函数内变量的值,您需要传递指针。 因此,通过扩展,要更改函数内指针的值,请传递指向指针的指针。

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

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

当你实例化时,请初始化pNext。您正在调试时它可能为空,但在现场它将为0x12AbD468或某些值。如果您有如下测试:

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

...而且你的程序会爆炸,用户会生气,打电话给技术支持,以某种方式获得你的电话分机号码,直接给你打电话并透露压力。

在你的情况下,由于 func1() 没有使用 pNext 作为输入参数,你可以直接从函数中返回它:

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

Object* func1()
{
  return Segment->GetFirstPara(0);
}

它应该是 (tā yīng gāi shì)


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

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




相关问题
热门标签