Salt la conținut

SUBIECTE NOI
« 1 / 5 »
RSS
Robotul martian european, revigor...

Geoana: „Sistemul de vot es...

Imprimare mai multe pagini intr-o...

trebuie sa depun declaratie unica...
 Ruse vs Rusesti

Le mai putem da pe brazda? tipsuri

Recomandari gips carton tavane. (...

ce fel de activitate intretinere ...
 Se poate imbunatati o poza sa se ...

Folosește cineva syncthing? ...

Închidere fereastra dupa deschidere.

Kit AC contine brate Unitatea ext...
 Smart Switch fara neutru

Ierbicid pentru parul porcului.

Smecher de talie grea

PH apa plata
 

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

- - - - -
  • Vă rugăm să vă autentificați pentru a răspunde
2 răspunsuri în acest subiect

#1
Rhesus

Rhesus

    Senior Member

  • Grup: Senior Members
  • Mesaje: 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!

Editat de Rhesus, 26 septembrie 2015 - 23:19.


#2
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Mesaje: 30.262
  • Î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.

Editat de dani.user, 26 septembrie 2015 - 23:14.


#3
Rhesus

Rhesus

    Senior Member

  • Grup: Senior Members
  • Mesaje: 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).

Editat de Rhesus, 26 septembrie 2015 - 23:57.


Anunturi

Bun venit pe Forumul Softpedia!

Utilizatori activi: 1

0 membri, 1 vizitatori, 0 utilizatori anonimi

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