Forum.hr

Natrag   Forum.hr > Informatička tehnologija > Za napredne korisnike > Programiranje
Korisničko ime
Lozinka

Programiranje Za programere i one koji to žele postati ...

Odgovor
 
Tematski alati Opcije prikaza
Old 18.03.2009., 22:11   #1
vasko
Registrirani korisnik
 
vasko Avatar
 
Registracija: Aug 2007.
Postova: 814
Smile C++ pokazivac i referenca

moze li neko da objasni sta su pokazivac i referenca tako da to pocetnik moze shvatiti?
__________________
username2 je napisao:"zasto bi decko dao150 kn dao odvede curu na pizzu? njemu se jebe a ne jede pizza"
vasko is offline  
Odgovori s citatom
Old 19.03.2009., 01:28   #2
heheh
lost in time
 
Registracija: Oct 2004.
Lokacija: Split
Postova: 1,479
Pošalji poruku preko ICQ korisniku heheh
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
__________________
stvarnost je samo iluzija prouzrokovana nedostatkom alkohola
heheh is offline  
Odgovori s citatom
Old 19.03.2009., 10:15   #3
vasko
Registrirani korisnik
 
vasko Avatar
 
Registracija: Aug 2007.
Postova: 814
Quote:
heheh kaže: Pogledaj post
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?

zasto je to potrebno?

Quote:
heheh kaže: Pogledaj post
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?
__________________
username2 je napisao:"zasto bi decko dao150 kn dao odvede curu na pizzu? njemu se jebe a ne jede pizza"
vasko is offline  
Odgovori s citatom
Old 19.03.2009., 16:52   #4
Wrbhhh
Naelektrizirani korisnik
 
Wrbhhh Avatar
 
Registracija: Aug 2006.
Lokacija: Zg
Postova: 7,724
Pošalji poruku preko Skype korisniku Wrbhhh
Quote:
vasko kaže: Pogledaj post
zasto bi zelio da imam dva imena za jednu promenljivu?

zasto je to potrebno?

zasto bi mi mogla zatrebati memorijska lokacija gde je smestena varijabla?
Evo jednostavan primjer:

Kod:
#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:
Kod:
#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;
}
__________________
@666&777

Zadnje uređivanje Wrbhhh : 19.03.2009. at 16:57.
Wrbhhh is offline  
Odgovori s citatom
Sponsored links
Advertisement
 
Advertisement
Old 20.03.2009., 14:05   #5
vasko
Registrirani korisnik
 
vasko Avatar
 
Registracija: Aug 2007.
Postova: 814
Kod:
#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:
Kod:
#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        
}
__________________
username2 je napisao:"zasto bi decko dao150 kn dao odvede curu na pizzu? njemu se jebe a ne jede pizza"
vasko is offline  
Odgovori s citatom
Old 20.03.2009., 15:29   #6
get
Zato
 
get Avatar
 
Registracija: Jul 2007.
Postova: 8,688
U C-u nema referenci.

Dakle:

T& je referenca na tip T

primjer pointera u C-u:

Kod:
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:

Kod:
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:

Quote:
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
__________________
Be Water My Friend
get is offline  
Odgovori s citatom
Old 20.03.2009., 16:38   #7
Wrbhhh
Naelektrizirani korisnik
 
Wrbhhh Avatar
 
Registracija: Aug 2006.
Lokacija: Zg
Postova: 7,724
Pošalji poruku preko Skype korisniku Wrbhhh
Quote:
vasko kaže: Pogledaj post
Kod:
// 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...

Quote:
vasko kaže: Pogledaj post
Kod:
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:
Kod:
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...
__________________
@666&777
Wrbhhh is offline  
Odgovori s citatom
Old 20.03.2009., 21:45   #8
vasko
Registrirani korisnik
 
vasko Avatar
 
Registracija: Aug 2007.
Postova: 814
ljudi pa zar nije referenca & operator koji vraca adresu?

kako drugo ime za varijablu?
__________________
username2 je napisao:"zasto bi decko dao150 kn dao odvede curu na pizzu? njemu se jebe a ne jede pizza"
vasko is offline  
Odgovori s citatom
Old 20.03.2009., 22:09   #9
get
Zato
 
get Avatar
 
Registracija: Jul 2007.
Postova: 8,688
Nitko tebi ne vraca adresu. Adresu pamti varijabla, odnosno ti.
__________________
Be Water My Friend
get is offline  
Odgovori s citatom
Old 20.03.2009., 22:52   #10
vasko
Registrirani korisnik
 
vasko Avatar
 
Registracija: Aug 2007.
Postova: 814
adresu pamti pokazivac valjda?
__________________
username2 je napisao:"zasto bi decko dao150 kn dao odvede curu na pizzu? njemu se jebe a ne jede pizza"
vasko is offline  
Odgovori s citatom
Old 21.03.2009., 04:32   #11
leafar
Registrirani korisnik
 
leafar Avatar
 
Registracija: Jun 2007.
Postova: 1,242
& ti vraća pointer od instance kad ga koristiš kao operator, npr.
Kod:
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
Kod:
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 *)
__________________
Our best hope is that the enemy kills so many of us that they become slightly depressed.
leafar is offline  
Odgovori s citatom
Old 21.03.2009., 07:04   #12
get
Zato
 
get Avatar
 
Registracija: Jul 2007.
Postova: 8,688
Quote:
vasko kaže: Pogledaj post
adresu pamti pokazivac valjda?
A pokazivač je što ??

4 bajtna Varijabla.
__________________
Be Water My Friend
get is offline  
Odgovori s citatom
Old 21.03.2009., 08:47   #13
matowin55
Registrirani korisnik
 
Registracija: Dec 2007.
Postova: 141
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 :

Kod:
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 .

Zadnje uređivanje matowin55 : 21.03.2009. at 09:06.
matowin55 is offline  
Odgovori s citatom
Old 21.03.2009., 19:52   #14
leafar
Registrirani korisnik
 
leafar Avatar
 
Registracija: Jun 2007.
Postova: 1,242
Quote:
get kaže: Pogledaj post
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
__________________
Our best hope is that the enemy kills so many of us that they become slightly depressed.
leafar is offline  
Odgovori s citatom
Old 22.03.2009., 08:17   #15
get
Zato
 
get Avatar
 
Registracija: Jul 2007.
Postova: 8,688
Quote:
leafar kaže: Pogledaj post
Puno programera je imalo tu pretpostavku, i onda je došo 64 bitni CPU, OS i kompajler i zajebo osnovnu premisu
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.
__________________
Be Water My Friend
get is offline  
Odgovori s citatom
Old 22.03.2009., 08:25   #16
leafar
Registrirani korisnik
 
leafar Avatar
 
Registracija: Jun 2007.
Postova: 1,242
kako to misliš nije zaživilo
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.
__________________
Our best hope is that the enemy kills so many of us that they become slightly depressed.
leafar is offline  
Odgovori s citatom
Old 22.03.2009., 12:51   #17
get
Zato
 
get Avatar
 
Registracija: Jul 2007.
Postova: 8,688
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.
__________________
Be Water My Friend
get is offline  
Odgovori s citatom
Sponsored links
Advertisement
 
Advertisement
Odgovor


Tematski alati
Opcije prikaza

Pravila postanja
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smajlići su On
[IMG] kôd je Off
HTML kôd je Off





Sva vremena su GMT +1. Trenutno vrijeme je: 00:31.



Powered by vBulletin Version 3.8.4 (hrvatski)
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
Site content ©1999-2009 Forum.hr
Ad Management by RedTyger