Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Ampersand: kad se koristi, a kad ne?

[es] :: C/C++ programiranje :: C/C++ za početnike :: Ampersand: kad se koristi, a kad ne?

[ Pregleda: 2106 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

aleksazr
zrenjanin

Član broj: 196784
Poruke: 245
*.mbb.telenor.rs.



+11 Profil

icon Ampersand: kad se koristi, a kad ne?14.05.2011. u 09:15 - pre 156 meseci
Code:

BOOL ReadFile(
    HANDLE hFile,
    LPVOID lpBuffer,
    DWORD nNumberOfBytesToRead,
    LPDWORD lpNumberOfBytesRead,
    LPOVERLAPPED lpOverlapped
    );


    char text[1];
    DWORD temp;

        ReadFile(hComm, text, 1, &temp, NULL);



I lpBuffer i lpNumberOfBytesRead su definisani kao pointeri.
Zašto onda text nema & a temp ima znak & ?

Malo mi je dojadilo da nagadjam gde kompajler hoće a gde neće taj znak,
pa ako bi neko da mi objasni ili da link... pošto mi google nije pomogao.
CYRfree 2.0.5 - ako bi ćirilicu radije čitali kao latinicu.
Serbian Latin & Cyrillic keyboard layout 08.nov.2022 - za QWERTY tastature sa našeg tržišta.
http://users.beotel.net/~gwh/

 
Odgovor na temu

karas

Član broj: 5574
Poruke: 482
*.dynamic.sbb.rs.



+1 Profil

icon Re: Ampersand: kad se koristi, a kad ne?14.05.2011. u 09:25 - pre 156 meseci
Operator & daje adresu promenljive, bez obzira da li je ona pokazivac ili ne. Tako na primer,
Code:

DWORD temp;
DWORD* tempAddr = &temp;

daje adresu promenljive tipa DWORD, dok
Code:

LPVOID lpBuffer;
LPVOID* lpBufferAddr = &lpBuffer;

daje adresu promenljive tipa LPVOID. Verovatno te buni to sto je LPVOID vec definisan kao pokazivac, ali nije nikakav problem uzeti adresu pokazivaca jer je i on neka varijabla.
U tvom slucaju, text je kao niz zapravo pokazivac na niz znakova, tako da se prosledjuje kao takav funkciji ReadFile(). S druge strane, temp je tipa DWORD pa kako funkcija prihvata pokazivac kao cetvrti parametar, treba proslediti adresu od temp.
Za vise detalja proguglaj za "address of operator".
Sveti Avgustin: "Dobar hrišćanin treba da se kloni matematičara i svih onih koji daju lažna proročanstva. Postoji opasnost da su matematičari već sklopili pakt sa Đavolom, da pomrače čovekov um i da ga okuju okovima pakla."
 
Odgovor na temu

aleksazr
zrenjanin

Član broj: 196784
Poruke: 245
*.mbb.telenor.rs.



+11 Profil

icon Re: Ampersand: kad se koristi, a kad ne?14.05.2011. u 10:35 - pre 156 meseci
Probao sam ova dva primera ispod, i izgleda da mi je sad jasno...

Code:

    char text;
    DWORD temp;
    ReadFile(hComm, &text, 1, &temp, NULL);

    char text[1];
    DWORD temp[1];
    ReadFile(hComm, text, 1, temp, NULL);


Znači, kad hoću da pošaljem adresu varijable u prvom primeru,
onda upotrebljavam znak &, dok u drugom ne upotrebljavam.

Iako su u oba primera definisane iste varijable i zauzimaju isto prostora,
u drugom primeru je definisano kao niz (array), a u prvom nije niz.

Da li je to jedini uslov (bar u ovom primeru)? Da li je varijabla NIZ ili nije?
Bez obzira na tip varijable: char, int, struktura...?
CYRfree 2.0.5 - ako bi ćirilicu radije čitali kao latinicu.
Serbian Latin & Cyrillic keyboard layout 08.nov.2022 - za QWERTY tastature sa našeg tržišta.
http://users.beotel.net/~gwh/

 
Odgovor na temu

karas

Član broj: 5574
Poruke: 482
*.dynamic.sbb.rs.



+1 Profil

icon Re: Ampersand: kad se koristi, a kad ne?15.05.2011. u 12:45 - pre 156 meseci
Citat:

Znači, kad hoću da pošaljem adresu varijable u prvom primeru, onda upotrebljavam znak &, dok u drugom ne upotrebljavam.

Da, operator & koristis za uzimanje adrese. U drugom primeru text vec jeste adresa/pokazivac na parce memorije gde se nalazi niz elemenata.

Citat:

Iako su u oba primera definisane iste varijable i zauzimaju isto prostora,
u drugom primeru je definisano kao niz (array), a u prvom nije niz.

Nisu definisane iste varijable, razlikuju im se tipovi, nije isto int i niz int-ova, bez obzira sto taj niz ima samo jedan element.

ReadFile() prihvata pokazivac (LPDWORD), sto znaci da joj treba proslediti adresu neke varijable tipa DWORD. Niz temp je zapravo pokazivac na niz DWORD elemenata i zato se moze proslediti kao parametar. Pogledaj http://www.cplusplus.com/doc/tutorial/pointers/ odeljak Pointers and arrays: "In fact, the identifier of an array is equivalent to the address of its first element, as a pointer is equivalent to the address of the first element that it points to, so in fact they are the same concept."

Sveti Avgustin: "Dobar hrišćanin treba da se kloni matematičara i svih onih koji daju lažna proročanstva. Postoji opasnost da su matematičari već sklopili pakt sa Đavolom, da pomrače čovekov um i da ga okuju okovima pakla."
 
Odgovor na temu

[es] :: C/C++ programiranje :: C/C++ za početnike :: Ampersand: kad se koristi, a kad ne?

[ Pregleda: 2106 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.