Тип void
в общем случае означает, что информация о типе не указывается.
Следует всегда иметь в виду, что указатель передает две части информации: тип указанногоdata (int
, double
, ...), который определяет, как его интерпретировать, и адрес данных, на которые он указывает, который указывает , где вы можете получитьфактическое значение указанных данных.
Информация о типе указана в типе указателя (double
*
, int
*
, ...), в то время как адрес данных является фактическим значением, содержащимся в переменной указателя.
Таким образом, указатель void
(void *
) является указателем, который не указывает никакой информации о типе,Он говорит вам, где находятся данные, но не говорит, как их интерпретировать.Вы знаете, что по этому адресу есть что-то, но вы не знаете, является ли это int
, double
или массивом летающих коров.Чтобы на самом деле использовать такие данные, вы должны получить информацию о типе об этом каким-то другим способом (например, с каким-то другим магическим параметром), привести этот указатель к обычному типу указателя и затем использовать его как обычно.* часто используется в C для поддержки своего рода общего программирования;см., например, библиотечную функцию qsort
C.
Указатель NULL
вместо этого - указатель, который ничего не указывает.В этом случае информация о типе указателя в целом присутствует, но отсутствует адрес указанных данных.Конечно, возможно иметь void *
, то есть NULL
.
Быстрый пример (предположим, что v
объявлен как double v;
):
Type information present
+----------------------+----------------------+
| ✔ | ✘ |
+---+----------------------+----------------------+
p c | | | |
v o o | ✔ | double * ptr = &v; | void * ptr = &v; |
a i n | | | |
l n t +---+----------------------+----------------------+
i t e | | | |
d e n | ✘ | double * ptr = NULL; | void * ptr = NULL; |
d t | | | |
+---+----------------------+----------------------+
Викторины : NULL
, по крайней мере в текущем стандарте, гарантированно будет равно 0.
В других областях языка void
всегда используется для указанияотсутствие типа.Использование его в качестве возвращаемого значения (примечание: я сейчас говорю о void
, а не void *
) означает, что функция не возвращает никакого значения, а приведение выражения к void - это причудливый способ отбросить значение (выповторно сообщите компилятору и другим программистам, что вы осознаете, что не используете определенное значение).