Sunteți pe pagina 1din 4

Laborator 4

Pointeri si referinte
Pointerul este o variabilă capabilă să rețină adrese ale altor variabile de tipul specificat la
declarare.
Tipul pointer se declară așa: tip_date*.
O variabilă pointer se poate scrie în felul următor:
- tip_date* nume_variabila
sau:
- tip_date * nume_variabila, respectiv, tip_date *nume_variabila.
Valoarea obținută printr-o variabilă pointer, este de fapt, valoarea de la o adresă specificată din zona de
memorie, ce se va scrie * nume_variabila.
Astfel, o variabilă este remarcată printr-un nume, printr-o valoare reținută la un moment dat din
mulțimea elementului tipului de date reprezentat și o adresă unică în zona de memorare. Adresa va
putea fi asociată unei variabile pointer.

Aplicația 1. Declararea unei variabile pointer, asocierea ca și adresă a altor variabile de tipul specificat la
declarare.
#include<iostream>
using namespace std;

int main()
{
//Varianta 1 de declarare: initializarea pointerului cu adresa unei variabile
cunoscute
int a; //variabila de tip intreg
int* b; //variabila pointer
b = &a; //initializarea variabilei pointer, prin asociere, ca si adresa a
variabilei a
a = 5;
cout << "Valorile sunt: " << a << ' ' << *b << '\n'; //aceeasi valoare
cout << "Adresele sunt: " << &a << ' ' << b << '\n'; //aceeasi adresa

//Varianta 2 de declarare: construirea unui pointer liber de asociere


int* c = new(int); //int* c; c=new(int); - pointer liber de o anumita variabila
*c = a;
cout << "Valorile sunt: " << a << ' ' << *c << '\n'; //aceeasi valoare
cout << "Adresele sunt: " << &a << ' ' << c << '\n'; //adrese diferite

//actualizarea unei variabile pointer


//modificam valoarea lui a
a += 5;
cout << "Valorile sunt: " << a << ' ' << *b << ' ' << *c << '\n';
cout << "Adresele sunt: " << &a << ' ' << b << ' ' << c << '\n';

//modificam valoarea de la adresa b


(*b) += 5;
cout << "Valorile sunt: " << a << ' ' << *b << ' ' << *c << '\n';
cout << "Adresele sunt: " << &a << ' ' << b << ' ' << c << '\n';

system("pause");
return 0;
}
Aplicația 2. Dimensiuni reținute de variabile de tip pointer.
#include<iostream>
using namespace std;
int main()
{
cout << "Tipurile de date: char=" << sizeof(char) << " int=" << sizeof(int) << "
int_lung=" << sizeof(long long) << " real=" << sizeof(double) << '\n'; //1 4 8 8
cout << "Pointerii: char=" << sizeof(char*) << " int=" << sizeof(int*) << "
int_lung=" << sizeof(long long*) << " real=" << sizeof(double*) << '\n'; //4 4 4 4
system("pause");
return (0);
}

Aplicația 3. Declararea și utilizarea variabilelor dinamice.


Mod de lucru: Se construiește un pointer liber. Prin utilizarea operatorului new se intră în zona Heap,
zonă de memorare a variabilelor dinamice.
#include<iostream>
using namespace std;
int main()
{
//citirea unei variabile intregi:
int* a;
a = new int; //ne ducem in Heap, prin constructia unei varibile dinamice
cout << "Valori intregi:\n";
cout << "\tdati o valoare: ";
cin >> *a;
cout << "\tvaloarea citita este: " << *a << '\n';
delete a; /*eliberez zona de memorie (unul dintre marile avantaje al unei
variabile dinamice este acela ca acestea au durata de viata determinata pe programator);
daca aceasta linie nu se da, eliberarea zonei de memorie se va face la sfarsitul
executiei functiei(programului)*/

//citirea unei variabile reale:


double* b;
b = new double;
cout << "Valori reale:\n";
cout << "\tdati o valoare: ";
cin >> *b;
cout << "\tvaloarea citita este: " << *b << '\n';
delete b;

system("pause");
return (0);
}

Aplicația 4. Aritmetica pointerilor. Cu ajutorul pointerilor, vom citi și vom afișa 3 numere întregi, sub
reprezentarea și forma unui șir de numere.
#include<iostream>
using namespace std;
int main()
{
//declaratia
int* a = new int[3]; //un pointer pentru un sir de 3 numere intregi

//citirea
cout << "Introduceti sirul de numere intregi:\n";
cout << "\tprimul element: ";
cin >> *a;
cout << "\tal doilea element: ";
cin >> *(a + 1); //vom merge pe urmatoarea locatie consecutiva din zona de
memorie, prin aritmetica pointerilor
cout << "\tal treilea element: ";
cin >> *(a + 2);

//afisarea
cout << "Elementele citite sunt: ";
for (int i = 0; i < 3; i++)
cout << *(a + i) << ' ';
cout << '\n';

//dealocare
delete a;

system("pause");
return (0);
}

Referința este un pseudonim, o redenumire, un alias, al unei variabile din zona de memorie,
pentru care se va păstra aceeași adresă unică. Referința nu este o adresă, ea este o variabilă de un
același tip ca cel al variabilei al cărei alias este. Declarația de referință se face prin introducerea tipului
referință (tip_date&), iar declarația unei referințe se va face obligatoriu cu inițializare a sa, spre variabilă
spre care constituie pseudonim.
Aplicația 5. Declararea de referințe.
#include<iostream>
using namespace std;
int main()
{
int a; //variabila intreaga
int& b = a; //b este o referinta a lui a
a = 10;
cout << a << '\t' << b << '\n'; //10 10
cout << &a << '\t' << &b << '\n'; //aceeasi adresa
b += 5;
cout << a << '\t' << b << '\n'; //15 15
cout << &a << '\t' << &b << '\n'; //aceeasi adresa
system("pause");
return (0);
}

Aplicația 6. Ce va afișa secvența următoare (fără a rula codul sursă)?


#include<iostream>
using namespace std;
int main()
{
int a = 1, * p, & q = a;
p = &a; //p este adresa lui a (a=1, *p=1, q=1)
(*p)++; //(*p=2, a=2, q=2)
q = *p + a; //(q=4, a=4, *p=4)
cout << a << '\n';
system("pause");
return (0);
}

a) dă eroare la declarații

b) dă eroare la instrucțiuni

c) 2

d) 4

Aplicația 7. Declarația void*.


#include<iostream>
using namespace std;

int main()
{
void* p;

int i = 21;
p = &i;
cout << i <<' '<< *(int*)p << '\n';

float f = 3.14f;
p = &f;
cout << f <<' '<< *(float*)p << '\n';

char c = 'A';
p = &c;
cout << c <<' '<< *(char*)p << '\n';

system("pause");
return 0;
}

S-ar putea să vă placă și