在下面的例子中,使用C时pNext指针会是什么?

时间:2008-10-11 00:13:33

标签: c pointers

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

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

我原以为它是指向func1()返回的firstpara的指针但是我看到NULL可以解释一下以及如何修复它以实际返回firstpara()指针?

5 个答案:

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