Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Schimbare adresa DNS IPv4 pe rout...

Recomandare Barebone

Monede JO 2024

Suprasolicitare sistem electric
 CIV auto import

Mutare in MOZAMBIC - pareri, expe...

Scoatere antifurt airtag de pe ha...

Magnet in loc de clește pent...
 Cumparat/Locuit in apartament si ...

Pot folosi sistemul PC pe post de...

Sokol cu distorsiuni de cross-over

Filtru apa potabila cu osmoza inv...
 Kanal D va difuza serialul “...

Upgrade xiaomi mi11

securitate - acum se dau drept - ...

Farmacia Dr Max - Pareri / Sugest...
 

Pointeri vs referinte

- - - - -
  • Please log in to reply
16 replies to this topic

#1
adi94

adi94

    Junior Member

  • Grup: Members
  • Posts: 190
  • Înscris: 06.11.2011
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
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,440
  • Înscris: 10.08.2005
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
adi94

adi94

    Junior Member

  • Grup: Members
  • Posts: 190
  • Înscris: 06.11.2011
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
rickysyv

rickysyv

    Senior Member

  • Grup: Senior Members
  • Posts: 2,620
  • Înscris: 08.03.2008
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
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,440
  • Înscris: 10.08.2005

View Postadi94, on 16 ianuarie 2017 - 10:26, said:

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).
In cod te rog

#6
rickysyv

rickysyv

    Senior Member

  • Grup: Senior Members
  • Posts: 2,620
  • Înscris: 08.03.2008
Î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
adi94

adi94

    Junior Member

  • Grup: Members
  • Posts: 190
  • Înscris: 06.11.2011
Un exemplu rapid asa Posted Image
int * add_one(int* B)
{
*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
tatarduka

tatarduka

    Senior Member

  • Grup: Senior Members
  • Posts: 3,042
  • Înscris: 30.10.2006
Folosesti pointer doar daca vrei sa pasezi NULL. O referinta nu poate fi NULL.

#9
adi94

adi94

    Junior Member

  • Grup: Members
  • Posts: 190
  • Înscris: 06.11.2011

View Posttatarduka, 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.

View Postrickysyv, 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.


#10
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,440
  • Înscris: 10.08.2005
descrie ce te-ai asteptat sa se intample
Attached File  poza.png   11.25K   33 downloads

evident ca sunt pointeri, dar conteaza spre ce indica fiecare

#11
adi94

adi94

    Junior Member

  • Grup: Members
  • Posts: 190
  • Înscris: 06.11.2011
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
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,440
  • Înscris: 10.08.2005

View Postadi94, on 16 ianuarie 2017 - 10:57, said:

Ştiu asta am şi vrut să subliniez.
si cu refereinta cum ramane ?

#13
_Smiley_

_Smiley_

    Guru Member

  • Grup: Senior Members
  • Posts: 20,032
  • Înscris: 24.02.2006

View Postadi94, 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
adi94

adi94

    Junior Member

  • Grup: Members
  • Posts: 190
  • Înscris: 06.11.2011
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ă.

View Post_Smiley_, on 16 ianuarie 2017 - 11:15, said:


cauti o diferenta acolo unde ea nu exista Posted Image
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)
Am înţeles că s-ar putea să ai nevoie de pointeri a căror adresă nu ai vrea poate sa o schimbi din greşeală sau mai ştiu eu din ce motive :D

View PostMarianG, on 16 ianuarie 2017 - 11:13, said:

si cu refereinta cum ramane ?
Dacă e cum am scris mai sus cred că m-am lămurit :D

#15
rickysyv

rickysyv

    Senior Member

  • Grup: Senior Members
  • Posts: 2,620
  • Înscris: 08.03.2008

View Postadi94, 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
adi94

adi94

    Junior Member

  • Grup: Members
  • Posts: 190
  • Înscris: 06.11.2011
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 :D

#17
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,236
  • Înscris: 24.02.2007
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

Chirurgia cranio-cerebrală minim invazivă Chirurgia cranio-cerebrală minim invazivă

Tehnicile minim invazive impun utilizarea unei tehnologii ultramoderne.

Endoscoapele operatorii de diverse tipuri, microscopul operator dedicat, neuronavigația, neuroelectrofiziologia, tehnicile avansate de anestezie, chirurgia cu pacientul treaz reprezintă armamentarium fără de care neurochirurgia prin "gaura cheii" nu ar fi posibilă. Folosind tehnicile de mai sus, tratăm un spectru larg de patologii cranio-cerebrale.

www.neurohope.ro

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate