【问题标题】:What will the pNext pointer be in the following case using C?在以下使用 C 的情况下,pNext 指针将是什么?
【发布时间】:2010-09-16 15:29:12
【问题描述】:
func()
{
    Object* pNext;
    func1(pNext);
}

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

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

【问题讨论】:

    标签: c pointers


    【解决方案1】:

    仅适用于 C++,您可以将参数设为引用

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

    这里发生的事情是通过值传递参数和通过引用传递之间的区别。 C 总是按值传递。为了取回一个值,该值需要是一个引用值(例如 Object** 将 Object* 称为指针)。 C++ 添加了引用参数(由 & 表示)。 按值传递仅传递数据的副本,而不传递实际数据本身。这就是函数调用中使用的变量没有在函数中更新的原因。

    【讨论】:

      【解决方案2】:

      在 c 中,你会想要:

      func1(&pNext);
      func1(Object** pNext) { *pNext = ... }
      

      在 C++ 中

      func1(pNext);
      func1(Object*& pNext) { pNext = ... }
      

      在任何一种语言中,您的示例都会将未初始化的Object* 传递给func1,后者将复制它,为该副本分配一个值,然后返回。请注意,原始 pNext 永远不会被修改(如果您为变量使用不同的名称,这将有所帮助)。

      在这两种语言中,如果需要传递引用而不是传递值,则需要显式传递引用。

      【讨论】:

        【解决方案3】:

        要更改指针,您需要将指针传递给指针,即Object** pNext。要更改函数内变量的值,请传递一个指针。因此,通过扩展,要更改函数内部指针的值,请将指针传递给该指针。

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

        【讨论】:

        • 不完全。 & 是地址运算符。
        • 是的,John 修复了 func1 中的 &pNext。我让他们走错了路。太久没用C了。
        【解决方案4】:

        请在实例化 pNext 时对其进行初始化。现在在调试时它可能为 NULL,但在该字段中它将是 0x12AbD468 或其他内容。如果您有类似的测试:

        if( NULL != pNext )
        {
          pNext->DoSomething();
        }
        

        ...你的程序会爆炸,用户会生气,打电话给支持并以某种方式获得你的电话分机,直接给你打电话,给你一个耳朵。

        在你的情况下,由于 'func1()' 不使用 pNext 作为参数,你可以简单地从函数中返回它:

        func()
        {
          Object *pNext = func1();
        }
        
        Object* func1()
        {
          return Segment->GetFirstPara(0);
        }
        

        【讨论】:

          【解决方案5】:

          应该是

          
          func()
          {
            Object *pNext;
            func1(&pNext);
          }
          
          void func1(Object **pNext)
          {
            *pNext = Segment->GetFirstPara(0);
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-01-05
            • 1970-01-01
            • 2016-06-02
            • 1970-01-01
            • 2012-06-02
            • 2015-09-28
            • 1970-01-01
            相关资源
            最近更新 更多