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 回答