Referinţe şi pointeri în C++

Intrebari despre limbajul C++, standardul C++, STL, OOP in C++ sau alte subiecte nelegate de VisualC++
Post Reply
adrian1234
Junior
Junior
Posts: 7
Joined: 30 May 2016, 15:39
Judet: Caraş-Severin

Referinţe şi pointeri în C++

Post by adrian1234 » 30 May 2016, 15:45

Salut tuturor,
Am si eu o nelămurire referitoare la pinteri şi referinţe. Dacă să zicem că am avea bucăţica de cod:

Code: Select all

int max(int &a)
{
	int x=12;
	a = x;
	return a;
}
După cum se vede am un int x care nu este pointer şi mă lasă să o egalez cu o adresă(&a).Când egalăm două variabile simple (int a=10,b=5; a=b;) nu se copie valoarea din una în alta? se ia adresa?
Dacă aş face în main ceva de genul in main functioneaza:

Code: Select all

int main()
{
	int k = 0;
	int x=max(k);
	return 0;
}
Mulţumesc



Mihail
Junior
Junior
Posts: 15
Joined: 11 Apr 2013, 10:14

Re: Referinţe şi pointeri în C++

Post by Mihail » 30 May 2016, 18:21

1. O referinta este defapt tot un pointer (dpdv intern), dar are alte reguli de folosire. In literatura i se mai spune "alias", lucru partial adevarat.
2. Cred ca faci o confuzie intre operatorul "&" din C (care returneaza adresa unei variabile) si referinte, care folosesc acelasi simbol la declarare. Nu este nici o legatura intre ele.
După cum se vede am un int x care nu este pointer şi mă lasă să o egalez cu o adresă(&a)
Ai atribuit valoarea unei referinte, unei variabile, lucru legal. Ar fi fost ilegal daca &a chiar era o adresa, adica ceva de genul:
int a = 7;
int b = &a;
Când egalăm două variabile simple (int a=10,b=5; a=b;) nu se copie valoarea din una în alta? se ia adresa?
Se copie valoarea in cazul asta.

Oricum, constructia ta are o mica eroare de logica, daca tot ai transmis parametrul prin referinta, n-are sens sa returnezi prin valoare (valoarea referintei), mai degraba faci asa:

void max(int &a)
{
a = 12;
}

int main()
{
int k = 0;

max(k);
cout<<k; // va afisa 12

return 0;
}

Deci retine ca referintele nu sint adrese. Ele au aparut in C++, si sint importante mai ales la transferul obiectelor intre functii si la returnarea obiectelor din functii - practic cresc viteza de executie a programelor prin faptul ca nu se creeaza o noua variabila pe stiva, ceea ce ar insemna consum de timp/memorie.

Cheers.

adrian1234
Junior
Junior
Posts: 7
Joined: 30 May 2016, 15:39
Judet: Caraş-Severin

Re: Referinţe şi pointeri în C++

Post by adrian1234 » 30 May 2016, 19:25

Ai atribuit valoarea unei referinte, unei variabile, lucru legal. Ar fi fost ilegal daca &a chiar era o adresa, adica ceva de genul:
int a = 7;
int b = &a;
Aici îmi e puţin neclar..tu dacă faci b=&a, acolo nu ar trebuie să găseşti o adresă, ceva gen 0x87ae43..de ce este tot un număr, doar ai egalat cu o adresă.

Mihail
Junior
Junior
Posts: 15
Joined: 11 Apr 2013, 10:14

Re: Referinţe şi pointeri în C++

Post by Mihail » 30 May 2016, 19:51

In principiu ai dreptate, dar limbajul nu-ti da voie sa faci o asemenea constructie din cauza ca s-ar incalca logica limbajului/pointerilor. Pentru asta exista pointerii, daca variabilele simple lucreaza cu valori, pointerii lucreaza cu adresele acelor variabile. Practic asta este definitia pointerului: O variabila care contine o adresa de memorie.

adrian1234
Junior
Junior
Posts: 7
Joined: 30 May 2016, 15:39
Judet: Caraş-Severin

Re: Referinţe şi pointeri în C++

Post by adrian1234 » 30 May 2016, 23:09

Crezi ca mă poţi lămuri puţin cu diferenţa din & din C şi & din C++.
Acolo nu cred că îi dace tot un alias...plus că în C nu este transmiterea prin referinţă.

Mihail
Junior
Junior
Posts: 15
Joined: 11 Apr 2013, 10:14

Re: Referinţe şi pointeri în C++

Post by Mihail » 31 May 2016, 11:41

Referintele (ca variabile) nu exista in C, deci nu putem vorbi de acest "alias", dar cu toate astea, transmiterea prin referinta exista in C, folosind pointerii. Stiu, e confuz, totul e sa faci bine diferenta intre transmiterea prin referinta (care inseamna transmiterea adresei acelei variabila si nu valoarea ei), si referintele ca variabile, care sint defapt tot un fel de pointeri (pointeri constanti mai exact, odata initializate, nu le mai poti modifica sa indice altceva).
In C, operatorul &(ampersand) "returneaza" adresa unei variabile sau a unei functii - deci da, putem avea si pointer la functie. Asta in contextul pointerilor, pentru ca "&" mai are si alte roluri in C, de exemplu cind lucrezi pe biti "&" are rolul de "SI (AND)", sau, dublat (&&), are rolul de "SI (AND) logic". Dar astea cred ca le stii...

In C:
int a = 7;
int *p = &a; // Atribuim adresa variabilei a, pointerului p

in C++:
int a = 7;
int &p = a; // Observi ca p este defapt o variabila (tip referinta) din cauza semnului "&" din fata lui p

Dar, la transmiterea prin referinta, poti folosi atit pointerii cit si referintele (ca variabile). Exemplu:

In C vei avea:
void foo(int *var)
{
*var = 7;
}
void main()
{
int a;
foo(&a);
}

Iar in C++:
void foo(int &var)
{
var = 7;
}
void main()
{
int a;
foo(a);
}

In ambele cazuri, la iesirea din functia "foo" variabila "a" va avea valoarea 7. Ambele cazuri reprezinta transmitere prin referinta.
Referintele sint mai sigure in sensul ca, avand o sintaxa mai usoara decit cea a pointerilor, te predispun mai greu la erori.

Incepe cu "The C Programming Language" by Kernighan & Ritchie, vezi ca o gasesti si in romana pe net.
O alta lectura, foarte buna e asta: http://www.okazii.ro/carti-tehnice/auto ... [173883482]
(autor: kovacs adrian, parca...) Putini stiu valoarea acestei carti. Daca reusesti s-o intelegi, poti sa zici ca mananci pointerii pe paine :)

Cheers.

adrian1234
Junior
Junior
Posts: 7
Joined: 30 May 2016, 15:39
Judet: Caraş-Severin

Re: Referinţe şi pointeri în C++

Post by adrian1234 » 31 May 2016, 15:35

Super Mihail, mersi tare mult pentru răspunsuri şi bibliografie.

adrian1234
Junior
Junior
Posts: 7
Joined: 30 May 2016, 15:39
Judet: Caraş-Severin

Re: Referinţe şi pointeri în C++

Post by adrian1234 » 31 May 2016, 15:48

Nu reuşesc să găsesc nicăieri în format eclectronic căţile, la "The C Programming Language" by Kernighan & Ritchie am găsit-o în engleză dar http://www.okazii.ro/carti-tehnice/auto ... d=pp_activ[173883482] nu dau nicăieri de ea. Posibil că e doar în format tipărit.


adrian1234
Junior
Junior
Posts: 7
Joined: 30 May 2016, 15:39
Judet: Caraş-Severin

Re: Referinţe şi pointeri în C++

Post by adrian1234 » 31 May 2016, 19:15

Uite aici o poză la cum văd eu pointerii referitor la exemplul tău de mai sus, cel cu:

Code: Select all

In C:
int a = 7;
int *p = &a; // Atribuim adresa variabilei a, pointerului p
Image

adrian1234
Junior
Junior
Posts: 7
Joined: 30 May 2016, 15:39
Judet: Caraş-Severin

Re: Referinţe şi pointeri în C++

Post by adrian1234 » 01 Jun 2016, 09:57

În cele din urmă am înţeles unde era problema..scriu aici poate mai întâlneşte cineva.
Pe mine mă deranja faptul că scriam int *p=&x; (eu atunci când vedem * mă gândeam că modifică valoarea şi astfel imi imaginam că valorii pointate de p o să i se atribuie o valoare,însă nu este aşa)
Ca şi la tine problema este în scriere...corect nu este int *p, ci int* p. Pointerul aparţine tipului de dată şi nu variabilei, acolo nu se accesează valoarea adresei pointate ci doar se declară un tip de data int*.
Problema e că C-C++-ul permite să punem * oricumde (ex int * p) şi asta m-a dezorientat.
Acum am înţeles, multumesc

Post Reply