PDA

View Full Version : C++ pokazivac i referenca


vasko
18.03.2009., 22:11
moze li neko da objasni sta su pokazivac i referenca tako da to pocetnik moze shvatiti? :ne zna:

heheh
19.03.2009., 01:28
evo ja cu pokusat...
to ti je u biti sasvim jednostavna stvar...

referenca je jednostavno drugo ime za neku varijablu...
recimo da imas varijablu broj negdi u kodu...
i sad svaki put kad napises rbroj (moze se zvat i drukcije al je jedan od obicaja tako pisat referencu...) to ti je isto ka da si napisa broj...:)

a pokazivac je isto nesto slicno:)
pokazivac pokazuje na neki prostor u memoriji...ako je pokazivac na neku varijablu onda pokazuje na adresu na kojoj se nalazi podatak iz te varijable...
recimo da imas varijablu broj koja sadrzi broj 5
i imas pokazivac koji pokazuje na tu varijablu...nazovimo ga pbroj
ako napises recimo cout<<pbroj na ekran ce se ispisat adresa na kojoj se nalazi broj 5, a ako ispred pbroj stavis *, onda dobijes vrijednost na toj adresi znaci broj 5

vasko
19.03.2009., 10:15
evo ja cu pokusat...
to ti je u biti sasvim jednostavna stvar...

referenca je jednostavno drugo ime za neku varijablu...
recimo da imas varijablu broj negdi u kodu...
i sad svaki put kad napises rbroj (moze se zvat i drukcije al je jedan od obicaja tako pisat referencu...) to ti je isto ka da si napisa broj...:)



zasto bi zelio da imam dva imena za jednu promenljivu? :ne zna:

zasto je to potrebno?

a pokazivac je isto nesto slicno:)
pokazivac pokazuje na neki prostor u memoriji...ako je pokazivac na neku varijablu onda pokazuje na adresu na kojoj se nalazi podatak iz te varijable...
recimo da imas varijablu broj koja sadrzi broj 5
i imas pokazivac koji pokazuje na tu varijablu...nazovimo ga pbroj
ako napises recimo cout<<pbroj na ekran ce se ispisat adresa na kojoj se nalazi broj 5, a ako ispred pbroj stavis *, onda dobijes vrijednost na toj adresi znaci broj 5


zasto bi mi mogla zatrebati memorijska lokacija gde je smestena varijabla? :ne zna:

Wrbhhh
19.03.2009., 16:52
zasto bi zelio da imam dva imena za jednu promenljivu? :ne zna:

zasto je to potrebno?

zasto bi mi mogla zatrebati memorijska lokacija gde je smestena varijabla? :ne zna:

Evo jednostavan primjer:

#include <stdio.h>

void zbroji(int a, int b, int c)
{
c = a + b;
printf("(podprg) c=%d\n", c);
}

int main(void)
{
int a, b, c;

a = b = c = 1;

zbroji (a, b, c);

printf("(glavni) c=%d\n", c);

return 0;
}

EDIT:

Usporedi rezultate s ovim primjerom:
#include <stdio.h>

void zbroji(int a, int b, int *c)
{
*c = a + b;
printf("(potpr) c=%d\n", *c);
}

int main(void)
{
int a, b, c;

a = b = c = 1;

zbroji (a, b, &c);

printf("(glavni) c=%d\n", c);

return 0;
}

vasko
20.03.2009., 14:05
#include <stdio.h>

void zbroji(int a, int b, int c)
{
c = a + b;
printf("(podprg) c=%d\n", c);// sta racuna ovaj izraz c=%d\n ?
} // a i odakle izvadi d leba ti? sta je d?

int main(void)
{
int a, b, c;

a = b = c = 1;

zbroji (a, b, c);

printf("(glavni) c=%d\n", c);

return 0;
}

EDIT:

Usporedi rezultate s ovim primjerom:
#include <stdio.h>

void zbroji(int a, int b, int *c)
{
*c = a + b;
printf("(potpr) c=%d\n", *c);
}

int main(void)
{
int a, b, c;

a = b = c = 1;

zbroji (a, b, &c);

printf("(glavni) c=%d\n", c);

return 0; // kolko sam skuzio sa ova dva primera si hteo da kazes da
// c u funkciji i c u mainu nije isto c
// el to?
// pa koristis pokazivac i referencu da preneses c iz f-je u
// main f-ju?
// iz ovoga znaci da referenca & radi kontra od pokazivaca
// * , ali to se ne slaze sa onim sto je haha reko u postu
// waiting for further instructions,houstone
}

:ne zna::ne zna::ne zna:

get
20.03.2009., 15:29
U C-u nema referenci.

Dakle:

T& je referenca na tip T

primjer pointera u C-u:


void swap(int* a, int* b)
{
int t;
if(!a || !b)
return;
t = *a;
*a = *b;
*b = t;
}

int main(void)
{
int x=5, y=7;
swap(&x, &y);
return 0;
}



primjer u C++-u sa referencama:


void swap(int& a, int& b)
{
int t = a;
a = b;
b = t;
}

int main()
{
int x=5, y=7;
swap(x, y);
}


referenca mora biti inicijalizirana

double d = 1.25;
double& r = d;

referenca se ne može promijeniti, sve operacije na referenci se odnose na varijablu na koju referenca pokazuje

int n = 1;
int& r = n;
r = 3; // mijenja vrijednost varijable n

preko konstantne reference ne može se mijenjati ni varijabla na koju referenca pokazuje

int n = 1;
const int& r = n;
r = 3; // compile error


Sa pointerima uvijek imaš veću mogućnost pogreške.

Evo što Strustup kaže:


A reference is an alternative name for an object. The main use of references is for specifying arguments
and return values for functions in general and for overloaded operators (Chapter 11) in particular.
The notationX & means reference to X .


A ima toga još. Evo i neki link na brzinu:

http://www.parashift.com/c++-faq-lite/references.html

Wrbhhh
20.03.2009., 16:38
// sta racuna ovaj izraz c=%d\n ?
// a i odakle izvadi d leba ti? sta je d?

Uopće se nemoj zamarat s tim. printf() je C funkcija za ispis, a ti radiš u C++-u. Inače, %d ima posebno značenje u funkciji printf(), ali to nije bitno za tebe...

return 0; // kolko sam skuzio sa ova dva primera si hteo da kazes da
// c u funkciji i c u mainu nije isto c
// el to?
// pa koristis pokazivac i referencu da preneses c iz f-je u
// main f-ju?
// iz ovoga znaci da referenca & radi kontra od pokazivaca
// * , ali to se ne slaze sa onim sto je haha reko u postu
// waiting for further instructions,houstone
}

Da, htio sam ti pokazat čemu uopće sve to. Kao što kažeš, da se vrijednosti varijabli iz funkcija mogu vratiti pozivatelju. Uopće nisam ni vidio da pitaš i za reference pa sam ti samo dao primjer s pokazivačima. :)

Ovo je C primjer za pokazivače. U C-u nema referenci kao tipova podataka. & je operator koji dohvaća adresu neke varijable:
int a;
int *p = &a; // dohvati adresu varijable a i spremi je u pokazivač p
------------------
int a;
int *p;
p = &a; // ovo radi isto što i ono gore samo je razlomljeno na jedan redak više

A reference ti je objasnio get...

vasko
20.03.2009., 21:45
ljudi pa zar nije referenca & operator koji vraca adresu? :confused:

kako drugo ime za varijablu? :confused:

get
20.03.2009., 22:09
Nitko tebi ne vraca adresu. Adresu pamti varijabla, odnosno ti.

vasko
20.03.2009., 22:52
adresu pamti pokazivac valjda?

leafar
21.03.2009., 04:32
& ti vraća pointer od instance kad ga koristiš kao operator, npr.

struct_foo a;
struct_foo* a_ptr1 = &a;
struct_foo* a_ptr2 = &a;
a_ptr->x = 1;
a_ptr->x = 2;


Ali kad je & u deklaraciji tipa onda je to refrenca

struct_foo a;
struct_foo& a_ref1 = a;
struct_foo& a_ref2 = a;
a_ref1.x = 1;
a_ref2.x = 2;

Na kraju će a.x bit 2, isto kao da si radio sa pointerom samo ne koristiš derefrencing operator (-> ili *)

get
21.03.2009., 07:04
adresu pamti pokazivac valjda?

A pokazivač je što ??

4 bajtna Varijabla.

matowin55
21.03.2009., 08:47
Reference se tiču samo C++-a(u kontekstu C i C++) i to je izvedeni tip : referenca na objekat tipa
N je tipa N&.
Refrenca se može shvatiti kao pokazivač ali kao konstantni pokazivač i ne zahtjeva se operator * dereferenciranja .
recimo :

void funk(int x, int y&)
{
x++; //stavarni argument se neće promijeniti
y++; //stavrni argument se mijenja

}

int main()
{
int blabla = 0;
int tlatla = 0;

funk(blabla,tlatla);
//i sad ovdje blabla ostaje jednako 0 a druga varijbla 1
//znaci reference nam trebaju za promjenu stvarnog argumenta
//eto jedan od razliga zasto


}

Razlika pokazivača i referenci su :
pokazivač ima operator * a referenca ne zahtjeva taj operator.
pokazivač jest objekat a refrenca nije baš "pravi" oobjekat
pokazivač se može preusmjeriti dok referenca ne može!
pokazivač može pokazivati na null a referenca ne(uvjek neki objekat).
Ne postoji pokazivač na referencu nego pokazivač "uzima adresu"(velika razlika!).
Kod reference ne postoji referenca na referencu ,niz referenci,referenca na void,dinamička referenca,pokazivač na referencu.
Dajte ,razlika je jer referenca kao izvedeni tip je poseban tip i &r i pok=&a
se jako razlikuje .

leafar
21.03.2009., 19:52
A pokazivač je što ??

4 bajtna Varijabla.

Puno programera je imalo tu pretpostavku, i onda je došo 64 bitni CPU, OS i kompajler i zajebo osnovnu premisu :D

get
22.03.2009., 08:17
Puno programera je imalo tu pretpostavku, i onda je došo 64 bitni CPU, OS i kompajler i zajebo osnovnu premisu :D

Hm, a za to moraš valjda i kompajlirati za 64 bita, zar ne.

64 bita nije zaživilo u pravom smislu, tako da ovo otpada.

leafar
22.03.2009., 08:25
kako to misliš nije zaživilo :confused:
normalno da moraš kompajlirat za 64 bita ali ima to i svoje prednosti, kompajler može radit određene optimizacije a kod nemora ić kroz 32 bit emulator (wow64), bolje je jednostavno ne računat s time, nema nekih prednosti.

get
22.03.2009., 12:51
Tek će zaživjeti u slijedećim generacijama. Dokle god postoji paralelizam os-a 32 i 64 ništa od toga. Pravi primjer ti je Vista 64, masu programa jos tjeras na 32 bita.

Linux nesto bolji, ali bome se moras pomuciti za dosta stvari da radi kako treba.
Jer slabo izdaju app-e sa dobrom podrskom 64.