[ azzpoz @ 09.05.2013. 21:49 ] @
Code:
struct info{
                   int broj;};

int main(){
               info obj;
               obj.broj=5;
ofstream upis("test007.txt");

upis.write((char*)(&obj),sizeof(obj));   // ova linija je pitanje
}

Mene zanima šta znači (char*)(&obj) i da li se (char*) naziva casting operator?
[ mish_ns @ 10.05.2013. 06:47 ] @
Da, to je cast operator...
Na taj način se konvertuje jedan tip podataka u drugi...
[ azzpoz @ 10.05.2013. 14:06 ] @
Zašto se koristi (char*) sa zvezdicom i ampersand (&obj)

float b=5;
Zašto je kod varijabli npr. int a = (int) b;
[ glorius @ 11.05.2013. 19:26 ] @
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.