Что такое указатель void в C++? [дубликат]
Возможные Дубликаты:
что такое указатель void и что такое нулевой указатель?
Я часто вижу код, который напоминает что-то вроде следующего:
void * foo(int bar);
что это значит? Означает ли это, что он может вернуться что-нибудь? Это похоже на dynamic
или object
в C#?
4 ответа:
A
void*
ничего не означает. Это указатель, но тип, на который он указывает, не известен.это не то, что он может вернуться "ничего". Функция, которая возвращает
void*
обычно делает одно из следующих действий:
- он имеет дело с неформатированной памятью. Вот что
operator new
иmalloc
возврат: указатель на блок памяти определенного размера. Поскольку память не имеет типа (потому что у нее нет правильно построенного объекта в это пока), его типизации. Т. е.:void
.- это непрозрачный дескриптор; он ссылается на созданный объект, не называя конкретный тип. Код, который делает это, как правило, плохо сформирован, так как это лучше сделать путем прямого объявления структуры/класса и просто не предоставляя для него публичного определения. Потому что тогда, по крайней мере, у него есть реальный тип.
- возвращает указатель на хранилище, содержащее объект известного типа. Однако, этот API используется для работы с объектами широкого разнообразие типов, поэтому точный тип, который возвращает конкретный вызов, не может быть известен во время компиляции. Поэтому будет некоторая документация, объясняющая, когда она хранит какие типы объектов и, следовательно, к какому типу вы можете безопасно его привести.
эта конструкция ничего как
dynamic
илиobject
в C#. Эти инструменты на самом деле знают, что такое исходный тип;void*
не. Это делает его гораздо более опасным, чем любой из этих, потому что очень легко ошибиться, и нет никакого способа спросить, является ли конкретное использование правильным.и на личной ноте, если вы видите код, который использует
void*
"часто", вы должны переосмыслить, какой код вы смотрите.void*
использование особенно в C++, должно быть редко, используется основной для работы в необработанной памяти.
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
источник: ссылке
A
void*
указатель используется, когда вы хотите указать указатель на кусок памяти без указания типа. Сmalloc
возвращает такой указатель, ожидая, что вы немедленно приведете его к определенному типу. Это действительно не полезно, пока вы не приведете его к другому типу указателя. Вы должны знать, к какому типу его применить, компилятор не имеет возможности отражения, чтобы знать, каким должен быть базовый тип.