Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Cum pot sa fac rost de un negativ...

Lant Bicicleta

Un designer artist: Raymond Loewy

ATS din contactor modular
 Parere apartament ~150k

Limitare la 100mb/s

Altercație

Cartonașe și stickere t...
 Ciobanesc german - zgarda electro...

Ce este instalatia asta? (Valea B...

BD-R Verbatim 25gb salvare Fisier

Lupte WW2
 Achizitie SUV, buget 17k euro

Gps traker pentru animale

Aplicatii terte pentru IPTV, OTT,...

Drept trecere cu “carulR...
 

Abordarea tipului referințã versus tipul pointer (C++/C#)

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

#1
Rhesus

Rhesus

    Senior Member

  • Grup: Senior Members
  • Posts: 2,884
  • Înscris: 22.04.2014
O chestiune foarte interesantă, pe care o putem înțelege foarte ușor. Totuși, dacă începi cu C++ și continui cu C# e mai ușor în a înțelege diferențele majore dintre reference type și pointer type. Dacă incepi direct cu un tutorial C# pt. incepători, ai dat de necuratu Posted Image De ce? Vedem mai jos.

Un articol f. interesant a lui Eric Lippert http://blogs.msdn.co...-addresses.aspx . Voi comenta puțin acest aspect.

În primul rând, mai toate resursele, tutorialele C#, definesc o variabilă de tipul referință ca o adresă a referentului . Nimic mai fals!.

Pornim de la C++. Încă de la începuturi, pointerul (o variabilă de tip pointer) se dorește a fi (și este) o adresă a referentului. Bun. Dacă citim două tutoriale, unul de C++ și unul de C#, in același timp ce realizăm? Că tipul referință este cam același lucru cu tipul pointer. Fals.

Pointerul este o adresă de memorie, din spațiul virtual de adrese.
int *p = new int();
int i = 20;
p=&i;


Pointerul p contine o referință a lui i, prin reținerea adresei lui.

Tipul referinta, spre deosebire de tipul pointer, nu contine [neaparat] adresa de memorie a referentului. In ciuda numelui pe care il poarta, referinta nu contine efectiv adresa referentului. Atunci ce conține ? Conform surselor interne o referință ...

Conceptul de referință fără a face referire la pointer este vag definit, și așa a și rămas. În sensul că deși mă refer la un obiect, nu utilizez, neaparat, adresa lui ca element de identificare!

C# a permis prin introducerea ambelor tipuri, atât ,,programatorilor” certați cu pointerii (înțelegeți de ce am pus in ghilimele) cât și cei profesioniști să realizeze aplicații după bunul plac.

Pointerii includ ideea de referință, dar invers nu. Din acest punct de vedere, diferența majoră de notat este aritmetica pointerilor, un lucru extrem de utilizat in practică. Tipul referință, neavând (neutilizând) adresa de memorie a referentului pentru identificare este utilizat doar in 2 moduri. 1. dereferentiere (ajungand la obiectul propriu-zis) , 2. comparare (egalitate) intre 2 referinte. Compararea nu se refera la o simpla comparatie intre adrese. Chiar autorul articolului, dezvoltator principal in cadrul echipei C#, spune sa tratăm tipul referintă ca ceva vag care ne permite să facem referire la un obiect. Pe când, îmi permit să adaug, tipul pointer este referință a unui obiect prin reținerea exactă a adresei lui.

Ca o concluzie: O referință este o variabilă care face referire la un obiect, și poate fi folosită ca un alias pt. acel obiect. Pointer-ul este o variabilă care face referire la un obiect prin adresa lui. Dacă pleacă de acasă, nu mai face referire la el. :lol:

Un subiect interesant de abordat, pe care astept sa-l discutam!

Edited by Rhesus, 26 September 2015 - 23:19.


#2
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,254
  • Înscris: 24.02.2007
Inca n-ai zis nimic de referintele din C++ :D
int& i = ...

Eu zic ca cel mai usor ar fi sa vezi referintele C#/Java ca niste smart pointers in C++. Au menirea de a identifica un obiect, se pot copia prin valoare dar tintesc inca spre acelasi obiect, nu permit operatii fara sens dar care ar avea sens cu pointeri (ex. ++), dar, spre deosebire de C++, dealocarea memoriei e gestionata de un GC si e permisa si o operatiune mai ciudata, dar intalnita la tot pasul: mutarea obiectelor de colo-colo in memorie cand are chef GC'ul.
In C# de exemplu, trebuie sa ceri explicit "fixarea" unui obiect in memorie (as in: lasa-l acolo si ia mana de pe el) cand vrei sa-i iei adresa si s-o trimiti spre unamanged code.

Edited by dani.user, 26 September 2015 - 23:14.


#3
Rhesus

Rhesus

    Senior Member

  • Grup: Senior Members
  • Posts: 2,884
  • Înscris: 22.04.2014
Mulțumesc că participi la subiect!

Referința e mai legată de obiectul în sine, nu de adresa lui. Cum ai spus și tu, referința identifică obiectul. Dacă obiectul își schimbă adresa, referința obiectului nu este atinsă, fiind mai mult un alias pt. obiectul in sine.
La pointeri e invers. Pointerul nu este atat de legat de obiectul in sine, ci de adresa lui. Dacă la un moment dat, obiectul ,,pleacă” (își schimbă adresa), pointer-ul rămâne cu ochii în soare.

Pointerul acționează asupra adresei de memorie, pe când referința acționează asupra unui obiect strict, indiferent unde pleacă acesta.
Este impropriu, cel puțin in limbajele avansate, să afirmăm că o adresă identifică un obiect (cum se folosește foooooooarte des, din păcate).

Edited by Rhesus, 26 September 2015 - 23:57.


Anunturi

Chirurgia endoscopică a hipofizei Chirurgia endoscopică a hipofizei

"Standardul de aur" în chirurgia hipofizară îl reprezintă endoscopia transnazală transsfenoidală.

Echipa NeuroHope este antrenată în unul din cele mai mari centre de chirurgie a hipofizei din Europa, Spitalul Foch din Paris, centrul în care a fost introdus pentru prima dată endoscopul în chirurgia transnazală a hipofizei, de către neurochirurgul francez Guiot. Pe lângă tumorile cu origine hipofizară, prin tehnicile endoscopice transnazale pot fi abordate numeroase alte patologii neurochirurgicale.

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