Возможный дубликат:
Что такое указатель void и нулевой указатель?
Я часто вижу код, похожий на следующее:
void * foo(int bar);
Что это значит? Означает ли это, что он может что-то вернуть? Это похоже на dynamic
или object
в С#?
Возможный дубликат:
Что такое указатель void и нулевой указатель?
Я часто вижу код, похожий на следующее:
void * foo(int bar);
Что это значит? Означает ли это, что он может что-то вернуть? Это похоже на dynamic
или object
в С#?
A void*
ничего не значит. Это указатель, но тип, на который он указывает, неизвестен.
Это не то, что он может вернуть "ничего". Функция, которая возвращает void*
, обычно выполняет одно из следующих действий:
operator new
и malloc
: указатель на блок памяти определенного размера. Поскольку память не имеет типа (поскольку в ней еще нет должным образом сконструированного объекта), она не имеет никакого значения. IE: void
.Это не что-то вроде dynamic
или object
в С#. Эти конструкции действительно знают, что такое оригинальный тип; void*
нет. Это делает его гораздо более опасным, чем любой из них, потому что очень легко ошибиться.
И в личном примечании, если вы видите код, который часто использует void*
", вам следует пересмотреть код, на который вы смотрите. void*
использование, особенно на С++, должно быть редкими, используется первичное для работы в необработанной памяти.
A void*
используется, если вы хотите указать указатель на кучу памяти без указания типа. C malloc
возвращает такой указатель, ожидая, что вы сразу внесите его в определенный тип. Это действительно не полезно, пока вы не добавите его в другой тип указателя. Ожидается, что вы узнаете, к какому типу он должен использовать его, компилятор не имеет возможности отражать возможность знать, какой должен быть базовый тип.
В качестве ключевого слова используется Void. Указатель void, также известный как общий указатель, является специальным типом указателя, который может быть направлен на объекты любого типа данных! Указатель void объявляется как обычный указатель, используя ключевое слово void в качестве типа указателей:
Общий синтаксис:
void* pointer_variable;
void *pVoid; // pVoid is a void pointer
Указатель void может указывать на объекты любого типа данных:
int nValue;
float fValue;
struct Something
{
int nValue;
float fValue;
};
Something sValue;
void *pVoid;
pVoid = &nValue; // valid
pVoid = &fValue; // valid
pVoid = &sValue; // valid
Однако, поскольку указатель void не знает, к какому типу объекта он указывает, он не может быть разыменован! Скорее, указатель void должен быть явно передан другому типу указателя перед его разыменованием.
int nValue = 5;
void *pVoid = &nValue;
// can not dereference pVoid because it is a void pointer
int *pInt = static_cast<int*>(pVoid); // cast from void* to int*
cout << *pInt << endl; // can dereference pInt
Пустота * может указывать на что угодно (это необработанный указатель без информации о типе).