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);
}