В моем проекте есть определение вызова функции, подобного этому.
int32 Map(void * &pMemoryPointer)
В вызывающем месте переданный параметр void *, почему мы не можем просто получить его как указатель вместо этого?
Не зная, что 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!
Это странный прототип функции IMHO, но это значит
(Обновить) что функция Map принимает ссылку на пустой указатель в качестве параметра.
Поэтому я думаю, что это эквивалентно объявлению функции следующим образом:
int32 Map(void** pMemoryPointer)