Указатель void является указателем на значение, тип и размер которого неизвестны. Я приведу пример того, как он может быть использован в C - хотя другие комментаторы верны, говоря, что он по большому счету не должен использоваться (и, фактически, не нужен) в C++.
Предположим, у вас есть структура, в которой хранится ключ и значение. Это может быть определено следующим образом:
typedef struct item_t
{
char *key;
int value;
} item_t;
Таким образом, вы можете использовать эту структуру, чтобы соответствовать любой строковый ключ с целочисленным значением. Но что, если вы хотите сохранить какое-то произвольное значение? Может быть, вы хотите, чтобы некоторые клавиши соответствовали целым числам, а некоторые клавиши соответствовали удвоениям? Вы должны определить свою структуру таким образом, чтобы она отслеживала (с помощью указателя) значение произвольного типа и размера. void *
приспосабливает счет в этом случае:
typedef struct item_t
{
char *key;
void *value;
} item_t;
Теперь, если значение является INT, вы можете получить на его значение, используя (int *) value
, или если его значение является двойной, вы можете сделать это с помощью (double *) value
. Это предполагает, конечно, что код с использованием структуры знает, какой тип он ожидает увидеть в каком контексте.
В C++ эта же функциональность обычно достигается не с использованием void *
, а с использованием таких вещей, как шаблоны или суперкласс, из которых сходят все ваши разные типы (например, Object в Java - список объектов может хранить некоторые строки, некоторые Integer и т. д.).
Не так много, как C.У нас есть лучшие способы сделать большую часть того, для чего он использовался. – chris
@chris вы могли бы подробнее ответить на приведенный ниже ответ и дать пример того, что его использовали и почему нам больше не нужно делать это на C++? – user997112
Мы используем его для взаимодействия с кодом C. –