Что означает тип параметра void* и что он использует?
Я просматриваю API, написанный на C++, и я не понимаю, что означает следующий тип параметра:
void*& data
Означает ли это, что пользователь передаст ссылку на пустой указатель? Если это правда, какой смысл? Я имею в виду, void * уже переадресован, так зачем вам его перенаправлять снова?
3 ответа
Трудно сказать, не видя его использования, но вы указываете, что ссылка - это уровень косвенности. Вы бы нашли это странным, если бы это был указатель на указатель? Это довольно часто - на самом деле вы имеете дело с ними, когда принимаете аргументы командной строки и получаете указатели на указатели на символы. Другой пример: если вы делаете хеш-карту с использованием сегментов и хотите иметь возможность вернуть указатель на указатель, запустивший блок.
Дело в том, что иногда вам нужно несколько уровней косвенности. Это правда, что смешивание указателей и ссылок может быть странным, но для этого есть веские причины. Одной из распространенных причин является необходимость взаимодействия кода C++ с C apis. Многие системные вызовы POSIX требуют указателей void, которые передаются, а затем изменяются, поэтому рассматриваемая функция C++ может выступать в качестве оболочки вокруг этого.
void *
означает передачу по указателю в C++, что означает, что вы передаете указатель, но на самом деле это копия указателя. Если вы изменили этот указатель в своей функции, например, изменили его адрес, он не будет отражен в указателе, который вы передали.
Объединяя это с передачей по ссылке, void *&
означает, что вы передаете псевдоним исходного указателя на эту функцию. Если вы изменили его, например, изменили его адрес, он будет отражен в исходном указателе.
Но будьте осторожны, чтобы не вернуть ссылку на локальный void*. Не делай что-то вроде этого:
void*& f()
{
int* a=new int(10);
void* x=(void*)a;
return x;
}