2013-02-18 4 views
15

Ho iniziato a sentirmi a mio agio con C e poi mi sono imbattuto in tipo casting. Se Ho il seguente definito in un file .h *Lanciare un puntatore del vuoto a una struttura

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

e questo in un altro file .h *

# define TYPE  void* 

Come faccio il cast del puntatore nullo alla struct in modo che posso utilizzare un variabile "TYPE val" che è passato in funzioni? Ad esempio, se voglio utilizzare il valore a cui punta TYPE, come posso lanciarlo in modo che possa passare quel valore a un'altra funzione?

+0

'#define TYPE void *' è una cattiva idea. Almeno dovrebbe essere un 'typedef' invece. Considera cosa succederebbe nella seguente dichiarazione: 'TYPE x, y;' o 'const TYPE x;'. – jamesdlin

+1

Inoltre, se hai a che fare con i puntatori 'void *' e C, non devi fare alcun casting esplicito. C permette ai puntatori di 'void *' di essere * implicitamente * cast: 'void * p = ...; struct data * val = p; '. – jamesdlin

+0

@jamesdlin Sono d'accordo che è una cattiva idea, ma non è una mia idea, quindi devo andare con esso. Quindi insieme a quello, quando 'TYPE val' è passato in una funzione come puntatore void, posso semplicemente dichiarare' struct data * temp = val; 'quindi passare temp a una funzione e dovrei essere in grado di usare temp-> valore? – user1852050

risposta

19
(struct data*)pointer 

invierà un puntatore a un puntatore a struct data.

+0

Forse sto morendo a morte, ma nell'esempio sopra questo significherebbe che per lanciare TYPE val al puntatore struct così posso ottenere il valore a cui punta, lo farei: (struct data *) val? Cosa fa esattamente? E se andassi avanti e dichiarassi una variabile 'int num = (struct * data) val' otterresti il ​​numero val punti o solo l'indirizzo di memoria che val indica? Se quest'ultimo, come faccio a lanciarlo per ottenere il valore di 'val' Grazie per la vostra pazienza. – user1852050

+0

@ user1852050 si confondono le variabili struct e le variabili pointer-to-struct. Quando hai bisogno di ottenere un puntatore su una struttura puoi usare l'operatore '&'. – wRAR

+0

Quindi potrei dichiarare e allocare memoria per una struttura temporanea e poi dargli il valore di & val? Come in temp = e val. E poi ottieni il valore usando temp-> value? – user1852050

-1

Typecasting puntatore nullo ad una struct può essere fatto in seguito

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

per questo siamo in grado di typecast a struct consente di dire la u vuole trasmettere questo vptr come variabile di struttura a qualche funzione

poi

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

    function((tdata *) vptr); 
} 

Nota: possiamo digitare puntatore vuoto a qualsiasi tipo, questo è lo scopo principale dei puntatori void.