func()
{
Object* pNext;
func1(pNext);
}
func1(Object* pNext)
{
pNext = Segement->GetFirstPara(0);
}
我本以为它会是从func1()返回的第一个段落的指针,但我看到的是NULL,可以有人解释一下,并告诉我如何修复以实际返回firstpara()指针吗?
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);
}