2013-02-18 5 views
15

Я начал чувствовать себя комфортно с C, а затем я столкнулся с типом. Если у меня есть следующие определены в * .h файлеЛитье указателя пустоты на структуру

struct data { 
    int value; 
    char *label; 
}; 

и это в другом * .h файле

# define TYPE  void* 

Как бросить указатель недействительным на структуры, так что я могу использовать переменная «TYPE val», которая передается в функции? Например, если я хочу использовать значение, на которое указывает TYPE val, как мне его передать, чтобы передать это значение другим функциям?

+0

'#define TYPE void *' - плохая идея. По крайней мере, это должно быть 'typedef'. Рассмотрим, что произойдет в следующем объявлении: 'TYPE x, y;' или 'const TYPE x;'. – jamesdlin

+1

Кроме того, если вы имеете дело с указателями 'void *' и C, вам не нужно делать какие-либо явные кастинги. C позволяет 'void *' указателям быть неявно * cast: 'void * p = ...; struct data * val = p; '. – jamesdlin

+0

@ jamesdlin Я согласен с тем, что это плохая идея, но это не моя идея, поэтому я должен пойти с ней. Таким образом, когда 'TYPE val' передается в функцию как указатель на void, я могу просто объявить' struct data * temp = val; ', а затем передать temp функции, и я должен иметь возможность использовать temp-> стоимость? – user1852050

ответ

19
(struct data*)pointer 

будет линять указатель на void с указателем на struct data.

+0

Возможно, я избиваю это до смерти, но в приведенном выше примере это означало бы, что для того, чтобы придать TYPE val указателю struct, чтобы я мог получить значение, на которое оно указывает, я бы сделал следующее: (struct data *) Вэл? Что именно это делает? И если бы я пошел вперед и объявил переменную 'int num = (struct * data) val', которая бы получала точки счисления числа или только адрес памяти, на который указывает val? Если последнее, как мне заставить его получить значение «val» Спасибо за ваше терпение. – user1852050

+0

@ user1852050 вы путаете переменные struct и переменные-указатели. Когда вам нужно получить указатель на структуру, вы можете использовать оператор '&'. – wRAR

+0

Итак, я могу объявить и выделить память для структуры temp, а затем дать ей значение & val? Как и в temp = & val. А затем получить значение с помощью temp-> value? – user1852050

-1

Приведения недействительные указатель на структуру могут быть сделаны в следующем

void *vptr; 
typedef struct data 
{ 
    /* members */ 
}tdata; 

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

затем

void function (tdata *); 
main() 
{ 
    /* here is your function which needs structure pointer 
     type casting void pointer to struct */ 

    function((tdata *) vptr); 
} 

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

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