【发布时间】:2013-11-02 19:10:39
【问题描述】:
在我的项目中,有这样一个函数调用的定义。
int32 Map(void * &pMemoryPointer)
在调用的地方,传递的参数是void*,为什么我们不能直接接收它作为一个指针本身,而不是这个?
【问题讨论】:
标签: c++ pass-by-reference pass-by-pointer
在我的项目中,有这样一个函数调用的定义。
int32 Map(void * &pMemoryPointer)
在调用的地方,传递的参数是void*,为什么我们不能直接接收它作为一个指针本身,而不是这个?
【问题讨论】:
标签: c++ pass-by-reference pass-by-pointer
在不知道Map 函数的作用的情况下,我猜它设置 指针。因此它必须通过引用传递。
使用对指针的引用,您可以分配内存并将其分配给函数内部的指针。例如
void DoSomething(int*& pointerReference)
{
// Do some stuff...
pointerReference = new int[someSize];
// Do some other stuff...
}
创建类似函数的另一种方法是返回指针,但由于问题中的Map 函数返回了无法使用的其他内容。
【讨论】:
向后阅读,这意味着 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!
【讨论】:
恕我直言,这是一个奇怪的函数原型,但这意味着 (更新) Map 函数接受对 void 指针的引用作为参数。
所以我觉得,相当于这样声明函数:
int32 Map(void** pMemoryPointer)
【讨论】: