Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Dacia 1316 cu 6 usi ...

Frecventa modificata radio

Un nou pericol pt batrani

Ar trebuii sa vindem imobiliarele...
 Dupa renuntarea la aparat dentar

pelerinaj in Balcik

Noul format Jpegli iși propu...

Dade, dade
 Parola la lock screen

Deparazitare externa pisici fara ...

Seriale turcesti/coreene online H...

Merita un Termostat Smart pentru ...
 Sfat achizitie MTB Devron Riddle

Problema mare cu parintii= nervi ...

switch microtik

Permis categoria B la 17 ani
 

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,238
  • Î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

Second Opinion Second Opinion

Folosind serviciul second opinion ne puteți trimite RMN-uri, CT -uri, angiografii, fișiere .pdf, documente medicale.

Astfel vă vom putea da o opinie neurochirurgicală, fără ca aceasta să poată înlocui un consult de specialitate. Răspunsurile vor fi date prin e-mail în cel mai scurt timp posibil (de obicei în mai putin de 24 de ore, dar nu mai mult de 48 de ore). Second opinion – Neurohope este un serviciu gratuit.

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