2013-05-31 1 views
4

Я попытался найти это на SO, но я думаю, что из-за синтаксиса и не зная точно, что искать, я немного отклеился.(void *) литье - для чего это используется?

Я видел (void *), используемый для приведения в действие, обычно для вызова функций. Для чего это используется?

+4

Не так много, как C.У нас есть лучшие способы сделать большую часть того, для чего он использовался. – chris

+0

@chris вы могли бы подробнее ответить на приведенный ниже ответ и дать пример того, что его использовали и почему нам больше не нужно делать это на C++? – user997112

+0

Мы используем его для взаимодействия с кодом C. –

ответ

3

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

Указатели Void более полезны с C, чем C++. Обычно вам следует избегать использования указателей void и вместо этого использовать перегрузку функций или шаблоны. Проверка типов - это хорошо!

+0

Скажите, если я ошибаюсь; «Указатель void в C - это по сути то же самое (по понятию) как Object в Java» – CodyBugstein

+0

, возможно, говоря: «Указатель void в C - это, по сути, одно и то же (по понятию), поскольку Object REFERENCE в Java« было бы вернее – rents

1

Это самый общий способ предоставления указателя на объект в C/C++. Как объект в C# или Java

1

Это в основном используется, когда вы хотите передать параметр, который может иметь различные состояния

Например, в ваших родовых кодах, который вы бы передать пустоту * в качестве параметра, то в «Specific "реализация этого кода, вы бы бросили пустоту * все, что вы хотите

Generic код abc.h

void Test(void* pHandle); 

кодекса Windows, abc.Cpp

void Test(void* phandle) 
{ 
    WindowsStructure* myStruct = (WindowsStructure*)(pHandle); 
    myStruct->getWhatINeed; 
} 

код Linux abc.Cpp

void Test(void* phandle) 
{ 
    LinuxStructure* myStruct = (LinuxStructure*)(pHandle); 
    myStruct->getWhatINeed; 
} 
3

Указатель void является указателем на значение, тип и размер которого неизвестны. Я приведу пример того, как он может быть использован в C - хотя другие комментаторы верны, говоря, что он по большому счету не должен использоваться (и, фактически, не нужен) в C++.

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

typedef struct item_t 
{ 
    char *key; 
    int value; 
} item_t; 

Таким образом, вы можете использовать эту структуру, чтобы соответствовать любой строковый ключ с целочисленным значением. Но что, если вы хотите сохранить какое-то произвольное значение? Может быть, вы хотите, чтобы некоторые клавиши соответствовали целым числам, а некоторые клавиши соответствовали удвоениям? Вы должны определить свою структуру таким образом, чтобы она отслеживала (с помощью указателя) значение произвольного типа и размера. void * приспосабливает счет в этом случае:

typedef struct item_t 
{ 
    char *key; 
    void *value; 
} item_t; 

Теперь, если значение является INT, вы можете получить на его значение, используя (int *) value, или если его значение является двойной, вы можете сделать это с помощью (double *) value. Это предполагает, конечно, что код с использованием структуры знает, какой тип он ожидает увидеть в каком контексте.

В C++ эта же функциональность обычно достигается не с использованием void *, а с использованием таких вещей, как шаблоны или суперкласс, из которых сходят все ваши разные типы (например, Object в Java - список объектов может хранить некоторые строки, некоторые Integer и т. д.).

 Смежные вопросы

  • Нет связанных вопросов^_^