func()
{
Object* pNext;
func1(pNext);
}
func1(Object* pNext)
{
pNext = Segement->GetFirstPara(0);
}
我原以为它是指向func1()返回的firstpara的指针但是我看到NULL可以解释一下以及如何修复它以实际返回firstpara()指针?
答案 0 :(得分:16)
仅限C ++,您可以将参数设为引用
func()
{
Object* pNext;
func1(pNext);
}
func1(Object*& pNext)
{
pNext = Segement->GetFirstPara(0);
}
这里发生的是按值传递参数和按引用传递之间的区别。 C总是按值传递。为了获得值,该值必须是参考值(例如,Object **将Object *称为指针)。 C ++添加了参考参数(由&表示)。 按值传递仅传递数据的副本,而不传递实际数据本身。这就是函数调用中使用的变量未在函数中更新的原因。
答案 1 :(得分:5)
在c中,您需要:
func1(&pNext);
func1(Object** pNext) { *pNext = ... }
在C ++中
func1(pNext);
func1(Object*& pNext) { pNext = ... }
在任何一种语言中,您的示例都会将未初始化的Object*
传递给func1
,这会复制它,为副本分配值然后返回。请注意,原始的pNext永远不会被修改(如果您为变量使用不同的名称,这将有所帮助)。
在两种语言中,如果需要传递引用而不是传递值,则需要显式传递引用。
答案 2 :(得分:4)
要更改指针,需要将指针传递给指针,即Object** pNext
。要更改函数内部变量的值,请传递指针。因此,通过扩展,要更改函数内指针的值,请将指针传递给指针。
func() {
Object* pNext;
func1(&pNext);
}
func1(Object** pNext) { *pNext = Segement->GetFirstPara(0); }
答案 3 :(得分:1)
请在实例化时初始化pNext。当你正在调试时它可能是NULL,但在字段中它将是0x12AbD468,或者什么。如果你有一个测试,如:
if( NULL != pNext )
{
pNext->DoSomething();
}
...并且您的程序会爆炸,用户会生气,拨打电话支持并以某种方式获取您的电话分机,直接给您打电话并给您一个耳机。
在你的情况下,由于'func1()'不使用pNext作为参数,你只需从函数中返回它:
func()
{
Object *pNext = func1();
}
Object* func1()
{
return Segment->GetFirstPara(0);
}
答案 4 :(得分:0)
应该是
func()
{
Object *pNext;
func1(&pNext);
}
void func1(Object **pNext)
{
*pNext = Segment->GetFirstPara(0);
}