Подтвердить что ты не робот

Что такое указатель void на С++?

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

Я часто вижу код, похожий на следующее:

void * foo(int bar);

Что это значит? Означает ли это, что он может что-то вернуть? Это похоже на dynamic или object в С#?

4b9b3361

Ответ 1

A void* ничего не значит. Это указатель, но тип, на который он указывает, неизвестен.

Это не то, что он может вернуть "ничего". Функция, которая возвращает void*, обычно выполняет одно из следующих действий:

  • Он работает в неформатированной памяти. Это то, что возвращает operator new и malloc: указатель на блок памяти определенного размера. Поскольку память не имеет типа (поскольку в ней еще нет должным образом сконструированного объекта), она не имеет никакого значения. IE: void.
  • Это непрозрачная ручка; он ссылается на созданный объект без обозначения определенного типа. Код, который делает это, как правило, плохо сформирован, так как это лучше сделать, переходя от объявления структуры/класса и просто не предоставляя публичное определение для него. Потому что тогда, по крайней мере, он имеет реальный тип.
  • В нем есть явная документация, рассказывающая вам, какие типы вы можете использовать для указателя.

Это не что-то вроде dynamic или object в С#. Эти конструкции действительно знают, что такое оригинальный тип; void* нет. Это делает его гораздо более опасным, чем любой из них, потому что очень легко ошибиться.

И в личном примечании, если вы видите код, который часто использует void* ", вам следует пересмотреть код, на который вы смотрите. void* использование, особенно на С++, должно быть редкими, используется первичное для работы в необработанной памяти.

Ответ 2

Указатель

A void* используется, если вы хотите указать указатель на кучу памяти без указания типа. C malloc возвращает такой указатель, ожидая, что вы сразу внесите его в определенный тип. Это действительно не полезно, пока вы не добавите его в другой тип указателя. Ожидается, что вы узнаете, к какому типу он должен использовать его, компилятор не имеет возможности отражать возможность знать, какой должен быть базовый тип.

Ответ 3

В качестве ключевого слова используется 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

Ответ 4

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