Что такое указатель void в C++? [дубликат]


Возможные Дубликаты:
что такое указатель void и что такое нулевой указатель?

Я часто вижу код, который напоминает что-то вроде следующего:

void * foo(int bar);

что это значит? Означает ли это, что он может вернуться что-нибудь? Это похоже на dynamic или object в C#?

4 63

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 возвращает такой указатель, ожидая, что вы немедленно приведете его к определенному типу. Это действительно не полезно, пока вы не приведете его к другому типу указателя. Вы должны знать, к какому типу его применить, компилятор не имеет возможности отражения, чтобы знать, каким должен быть базовый тип.

пустота* может указывать на что угодно (это необработанный указатель без какой-либо информации о типе).