Pointeri vs referinte
Last Updated: Jan 16 2017 17:59, Started by
adi94
, Jan 16 2017 10:12
·
0
#1
Posted 16 January 2017 - 10:12
Salut,
Citesc de ceva timp topicurile de pe stackoverflow referitoare la referințe și pointeri și care opțiune ar fi mai indicată însă nu înțeleg un detaliu. Care e mai exact diferența între ele? De exemplu dacă returnez un pointer e o adresă care indica o variabila, funcție, obiect samd. Daca vreau să folosesc entitatea respectivă și de exemplu să-i schimb valoarea trebuie deferențiat. La returnez o referință tot o adresă e, numai că nu mai trebuie deferențiată. Chestia asta nu prea o înțeleg...ambele returneaza un pointer și totuși sunt diferite. Știu că referința e un alias și modifcările o să se regasească peste tot, însă același lucru l-as putea spune și despre pointer...exemplu int main() { int* p = new int(3); int *x = p; *x = 10; std::cout << *p; getchar(); return 0; } Dupa executare p-ul o să fie 10. |
#2
Posted 16 January 2017 - 10:20
Citeste si de pe softpedia -- pointeri --
O imagine cat o mie de cuvinte https://blog.penjee....java-graphical/ [ https://blog.penjee.com/wp-content/uploads/2015/02/pass-by-reference-vs-pass-by-value-animation.gif - Pentru incarcare in pagina (embed) Click aici ] |
#3
Posted 16 January 2017 - 10:26
Inteleg cu transimiterea prin referinta si prin valoare...ma mine ma intereseaza pointer vs referinta.
Daca dau ca parametru un pointer si mai jos modific acelasi pointer modificarile o sa se regasesca peste tot unde este referit acelasi pointer (aceiasi variabila spre care pointeaza p). Edited by adi94, 16 January 2017 - 10:27. |
#4
Posted 16 January 2017 - 10:31
Super tare imaginea cu ceașca de cafea, haha! Prin pointer înțelegi de obicei valoarea stocată în adresa de memorie (*p), iar prin referință înțelegi adresa fizică unde e stocată valoarea respectivă (&p).
|
#5
Posted 16 January 2017 - 10:39
#6
Posted 16 January 2017 - 10:47
În codul exemplificat de tine ai 2 pointeri (x și p) care indică ("pointează") amândoi spre aceeași adresă de memorie, de aia îți afișează 10 la execuție! Pe oricare îl afișezi tot 10 arată.
Edited by rickysyv, 16 January 2017 - 10:48. |
#7
Posted 16 January 2017 - 10:49
Un exemplu rapid asa
int * add_one(int* { *b += 1; return b; } int main() { int *x = new int(4); int* val = add_one(x); *val = 0; int* rez2 = add_one(val); getchar(); return 0; } [ https://s30.postimg.org/sgqd8r6fl/Untitled.png - Pentru incarcare in pagina (embed) Click aici ] Edited by adi94, 16 January 2017 - 10:58. |
#8
Posted 16 January 2017 - 10:50
Folosesti pointer doar daca vrei sa pasezi NULL. O referinta nu poate fi NULL.
|
#9
Posted 16 January 2017 - 10:57
tatarduka, on 16 ianuarie 2017 - 10:50, said:
Folosesti pointer doar daca vrei sa pasezi NULL. O referinta nu poate fi NULL. Asta stiu dar nu cred ca e singura diferenta pe mine ma intereseaza mai mult sa zic ce returneaza fiecare si care e diferenta dintre ce returneaza pentru ca in mare ambii sunt pointeri. rickysyv, on 16 ianuarie 2017 - 10:47, said:
În codul exemplificat de tine ai 2 pointeri (x și p) care indică ("pointează") amândoi spre aceeași adresă de memorie, de aia îți afișează 10 la execuție! Pe oricare îl afișezi tot 10 arată. Ştiu asta am şi vrut să subliniez. Edited by adi94, 16 January 2017 - 10:55. |
#11
Posted 16 January 2017 - 11:12
E ok ce s-a întâmplat.
Adică folosind aceiaşi pointer toate variabilele pointeză spre aceiaşi valoare lucru care se întâmplă şi cu referinţele. Când îi dai o referinţă îi ia adresa variabilei respective şi îi schimba valoarea în funcţie de ce vrei tu să-i faci. De fapt acum că am scris şi m-am mai gândit...exemplul meu mai de sus cu funcţia add_one este defapt transmisă prin valoare, chair dacă are pointer nu? Adica functiei respective când este apelată în main i se mai face o copie pe stivă, sau luccreaza direct pe adresele parametrilor respectivi? |
#12
Posted 16 January 2017 - 11:13
#13
Posted 16 January 2017 - 11:15
adi94, on 16 ianuarie 2017 - 10:57, said:
Asta stiu dar nu cred ca e singura diferenta pe mine ma intereseaza mai mult sa zic ce returneaza fiecare si care e diferenta dintre ce returneaza pentru ca in mare ambii sunt pointeri. cauti o diferenta acolo unde ea nu exista referintele trebuie initializate si nu pot fi modificate ulterior, iar asta e suficient pentru a justifica existenta lor. gandeste-te de exemplu la constante, pentru ce au fost introduse in toate limbajele de programare, si vei intelege de ce a fost nevoie si de referinte (pe langa pointeri) |
#14
Posted 16 January 2017 - 11:25
Am inteles...m-am blocat în comparaţia asta dintre pointeri şi referinţe pentru ca valoarea pointerului este tot o adresă şi eu aveam impresia că astfel transmiterea se face tot prin adresă (ceea ce sper că e fals ) ). Referinţa ia adresa obiectului în sine iar valoarea conţinutul ei ceea ce face ca în cazul pointerilor valoarea să fie tot o adresă.
_Smiley_, on 16 ianuarie 2017 - 11:15, said: cauti o diferenta acolo unde ea nu exista referintele trebuie initializate si nu pot fi modificate ulterior, iar asta e suficient pentru a justifica existenta lor. gandeste-te de exemplu la constante, pentru ce au fost introduse in toate limbajele de programare, si vei intelege de ce a fost nevoie si de referinte (pe langa pointeri) MarianG, on 16 ianuarie 2017 - 11:13, said:
si cu refereinta cum ramane ? |
#15
Posted 16 January 2017 - 12:19
adi94, on 16 ianuarie 2017 - 10:57, said:
Ştiu asta am şi vrut să subliniez. E destul de îmbârligată logica asta a pointerilor! Deși în exemplul dat de tine pointerii p și x conțin același lucru (adică p==x returnează TRUE), totuși ei indică spre zone de memorie diferite deoarece &p != &x dar chiar și așa ambele zone de memorie conțin valoarea 10 (deci *p==*x returnează tot TRUE). |
|
#16
Posted 16 January 2017 - 12:29
Da..am mai urmarit ceva documentaţie pe net şi am înţeles ideea zic eu.
Până la urmă cam totul se restrange la ce a zis _Smiley_, pointeri constanţi (referinţe) si pointeri aş zice eu |
#17
Posted 16 January 2017 - 17:59
Daca functia ta doar citeste o structura mai complexa sau doar returneaza o valoare, folosesti referinte ca te scapa de grija de a verifica daca pointerul e valid sau nu (dai sarcina asta mai departe, la cel ce iti apeleaza codul)
Daca vrei sa retii ceva intr-o structura, se complica treaba. Poti avea referinte, dar doar daca initializezi pe loc campul respectiv si asa il lasi. De exemplu nu poti folosi referinte pentru o lista inlantuita, ca acolo ori nu stii la inceput cine va fi parintele/copilul, ori poate vrei sa-l mai schimbi pe parcurs. Apoi, daca retii un pointer pentru mai tarziu, exista riscul sa devina invalid, un alt cod sa elibereze memoria fara sa stie ca X mai tine inca un pointer spre ea. Asa ca, pointeri vs referinte s-a transformat in raw pointers VS smart pointers VS referinte |
Anunturi
Bun venit pe Forumul Softpedia!
▶ 0 user(s) are reading this topic
0 members, 0 guests, 0 anonymous users