【问题标题】:meaning of reference and pointer together?引用和指针的含义?
【发布时间】:2013-11-02 19:10:39
【问题描述】:

在我的项目中,有这样一个函数调用的定义。

    int32 Map(void * &pMemoryPointer)

在调用的地方,传递的参数是void*,为什么我们不能直接接收它作为一个指针本身,而不是这个?

【问题讨论】:

    标签: c++ pass-by-reference pass-by-pointer


    【解决方案1】:

    在不知道Map 函数的作用的情况下,我猜它设置 指针。因此它必须通过引用传递。


    使用对指针的引用,您可以分配内存并将其分配给函数内部的指针。例如

    void DoSomething(int*& pointerReference)
    {
        // Do some stuff...
    
        pointerReference = new int[someSize];
    
        // Do some other stuff...
    }
    

    创建类似函数的另一种方法是返回指针,但由于问题中的Map 函数返回了无法使用的其他内容。

    【讨论】:

    • 这正是他们在函数内部所做的,现在我完全理解了。谢谢你:)
    【解决方案2】:

    向后阅读,这意味着 pMemoryPointer 是对指向 void 的指针 (*) 的引用 (&)。这意味着您传递的任何指针都会被引用,并且该函数将对pMemoryPointer 进行的任何修改也会影响原始(传递的)指针(例如,更改pMemoryPointer 的值也会更改原始指针的值) .

    为什么我们不能直接接收它作为指针本身,而不是这个?

    这是因为通过这样做,您正在复制指针,并且您对副本所做的任何更改都不会反映到原始指针。

    void im_supposed_to_modify_a_pointer(void* ptr) {  // Oh no!
       ptr = 0xBADF00D;
    }
    
    int* my_ptr = 0xD0GF00D;
    im_supposed_to_modify_a_pointer(my_ptr);
    ASSERT(my_ptr == 0xBADF00D) // FAIL!
    

    【讨论】:

      【解决方案3】:

      恕我直言,这是一个奇怪的函数原型,但这意味着 (更新) Map 函数接受对 void 指针的引用作为参数。

      所以我觉得,相当于这样声明函数:

       int32 Map(void** pMemoryPointer)
      

      【讨论】:

      猜你喜欢
      • 2020-11-29
      • 1970-01-01
      • 2014-09-30
      • 2015-02-13
      • 1970-01-01
      • 2020-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多