Prvo sto je ovde bitno je da write prihvata char* tako da ti moras da izvrsis castovanje u pozivajucoj funkciji inace ne mozes parametar da predas ako nisu istog tipa.
Klasa info i char* (a i char) nemaju nista zajednicko i ti ne mozes jednostavno da castujes:
Code:
info obj;
char a = (char)obj;
char je velicine 1 bajt a velicina info je odredjena zbirom velicina promenljiva u bajtovima koje sadrzi. U ovom slucaju, posto sadrzi int, to je (zavisi od sistema ali neka bude) 4 bajta. Cak i ako info sadrzi char umesto int, kompajler ti nece dozvoliti da napises gore spomenuti kod.
Ako probas:
Code:
int b = 3;
char* a = (char*)b;
Posto pointer UVEK sadrzi adresu, char* a = (char*)b ce konvertovati broj 3 (posto je to vrednost b) i sada ce a pokazivati na adresu u memoriji 0x00000003 koja verovatno nije validna.
Sada objasnjenje glavnog pitanja:
char* pData = (char*)(&obj);
Kada zelis da uzmes adresu objekta, tj. da napravis pointer koji ce sadrzati adresu objekta, pises:
info* pInfo = &obj;
tako da (&obj) implicitno pretvara obj u info*.
info* je velicine 4 bajta
char* je velicine 4 bajta
Kompajler ti nece dozvoliti da pises: char* pData = pInfo iako su iste velicine. Dobices poruku 'cannot convert from info* to char*'.
Ali ako onda castujes iz info* u char* eksplicitno to ce raditi.
char* pData = (char*)pInfo; // OK
A posto je pInfo = &obj; // --->
char* pData = (char*)(&obj);
---------
Malo objasnjenje write funkcije (malo je advanced):
Write funkcija radi samo sa bajtovima tako da ti mozes da predas bilo koji objekat tako sto predas pocetnu adresu te promenljive u memoriji i zadas koliko bajtova je velika promenljiva.
Uzimanje pointera na neki objekat je u stvari uzimanje pocetne adrese tog objekta (svaki objekat u memoriji je niz bajtova sa pocetnom adresom i velicinom) i kad znas pocetnu adresu i koliko je objekat veliki u bajtovima u mogucnosti si da ga napises kao seriju char-ova (bajtova) u fajl.