Che cosa significa questo codice?
codice:int a = 5; int *b = (int *) &a;
Che cosa significa questo codice?
codice:int a = 5; int *b = (int *) &a;
quando è così leggi pian piano l'istruzione.
Parti da &a: questa istruzione serve a chiedere l'indirizzo della variabile "a" che tu hai definito di tipo intero nella precedente istruzione.
Poi hai le parentesi, quindi vuol dire che tu questo indirizzo vuoi considerarlo come un puntatore ad intero (int *) ovviamente lo assegni ad una variabile del corretto valore ( int * b)
se esegui questo pezzo di codice così
a video vedi valore di a 5codice:int a = 5; int *b = (int *) &a; printf("valore di a %d \n" , *b);
Per inciso, quel cast non serve a niente, dato che sia il tipo dell'espressione di partenza (&a) che quello della variabile da inizializzare (b) è comunque int *.
"Del corretto tipo", semmai; tipo e valore sono due cose ben distinte.Originariamente inviato da valia
ovviamente lo assegni ad una variabile del corretto valore ( int * b)
Amaro C++, il gusto pieno dell'undefined behavior.
infatti è un rafforzativo inutile,Originariamente inviato da MItaly
Per inciso, quel cast non serve a niente, dato che sia il tipo dell'espressione di partenza (&a) che quello della variabile da inizializzare (b) è comunque int *.
volevo dire tipo, piccolo lapsus scusateOriginariamente inviato da MItaly
"Del corretto tipo", semmai; tipo e valore sono due cose ben distinte.
Ti dirò di più, a mio avviso (se usato in del codice "vero") è anche pericoloso, visto che, se venisse cambiato il tipo di a ma ci si dimenticasse di cambiare il tipo di b, l'errore passerebbe inosservato.Originariamente inviato da valia
infatti è un rafforzativo inutile,
Nulla di male, capita, puntualizzavo solo per evitare che sys14 facesse confusione.volevo dire tipo, piccolo lapsus scusate![]()
Amaro C++, il gusto pieno dell'undefined behavior.
penso sia solo un esempio d'uso del casting (lo spero), anche se devo dire nei libri di testo che ho usato una roba del genere non l'ho mai vista :|Originariamente inviato da MItaly
Ti dirò di più, a mio avviso (se usato in del codice "vero") è anche pericoloso, visto che, se venisse cambiato il tipo di a ma ci si dimenticasse di cambiare il tipo di b, l'errore passerebbe inosservato.
ok, chiarito questo, arriviamo ad un altro punto:
codice:struct sockaddr_in info; /* struttura sockaddr_in implementata per poter configurare la connessione (porta, protocollo)*/ struct hostent *h; /* struttura hostnet implementata per poter configurare l'ip o host*/ info.sin_family = AF_INET; /* protocollo */ info.sin_port = htons(6669); /* porta */ h = gethostbyname("no-host"); /* host */ memcpy((char *)&info.sin_addr, (char *)h->h_addr_list[0], 4); /* che significa questa riga? */
Premetto che, come prima, anche qui tutti i cast sono inutili, dato che tutte le espressioni a cui sono applicati sono già del tipo giusto (memcpy accetta dei void * come primi argomenti, a cui può decadere qualunque puntatore senza cast). Dunque la possiamo riscrivere come:
Andiamo con ordine; la memcpy è una funzione che copia nella destinazione specificata dal primo argomento il numero di byte specificati nell'ultimo argomento. La zona da cui i byte da copiare sono presi è specificata come secondo argomento.codice:memcpy(&info.sin_addr, h->h_addr_list[0], 4);
info è un sockaddr_in, che rappresenta un endpoint del socket; il suo membro sin_addr rappresenta l'indirizzo IP, ed è una union che di fatto espone in tre maniere diverse (come 4 byte, come 2 valori da 16 bit o come un singolo valore a 32 bit) gli stessi 4 byte di memoria. In ogni caso, &info.sin_addr equivale a prendere l'indirizzo di memoria a cui viene memorizzato l'indirizzo. Tale locazione di memoria viene usata come destinazione della copia.
h rappresenta un host; h_addr_list è un array di char * che contiene i vari indirizzi associati all'host in questione. h->h_addr_list[0] si riferisce dunque al primo degli indirizzi associati all'host. Di fatto nella memoria puntata da h->h_addr_list[0] si trovano semplicemente 4 byte che rappresentano l'indirizzo (assumendo di star parlando di IPv4). Tali 4 byte dunque sono quelli che vengono copiati da memcpy.
Per farla breve: la riga in questione copia l'indirizzo dell'host rappresentato da h nel campo dell'indirizzo della variabile info.
Amaro C++, il gusto pieno dell'undefined behavior.