4.2Referinţe
O referinţă este un alt nume pentru o variabilă. Fie T tipul unei variabile şi fie instrucţiunea ce defineşte o variabilă
T nume_variabilă;
Instrucţiunea de definire a unei referinţe este
T& nume_referinţă = nume_variabilă
unde
nume_referinţă este numele variabilei referinţă.
Variabila nume_variabilă trebuie să fie declarată înainte şi să aibă tipul T. De exemplu instrucţiunile
int x;
int& rx = x;
declară pe rx ca fiind o referinţă a lui x (este obligatoriu ca variabila x de tip întreg să fie declarată anterior). Secvenţa anterioară se poate scrie
int x, &rx = x;
Numele x şi rx sunt două nume diferite pentru aceeaşi variabilă. Ele au totdeauna aceeaşi valoare şi aceeaşi adresă.
Probleme rezolvate
Problema 1. Să se definească o funcţie care să permute valorile a două variabile tip double. Prototipul funcţiei va fi
void perm(double & a, double & b);
Programul este prezentat în continuare.
# include
using namespace std;
/* functie ce permuta valoarea a doua variabile */
void perm(double& a, double& b)
{
double c;
c = a;
a = b;
b = c;
return;
}
// testarea functiei perm
int main()
{
double x = 7.2, y = 12.5;
cout << "valorile initiale x = " << x << " y = " << y << endl;
perm(x, y);
cout << "valorile permutate x = " << x << " y = " << y << endl;
return 0;
}
Mai jos sunt reproduse rezultatele execuţiei programului.
Problema 2. Se va verifica faptul că o referinţă este o altă denumire pentru o variabilă, scriind adresele variabilei şi referinţei. Programul de rezolvare a acestei probleme este prezentat în continuare.
# include
using namespace std;
int main()
{
int a = 3;
int& ra = a;
// scrie valoarea variabilei şi referintei
cout << “valoare variabilei este” << a << endl;
cout << “valoarea referintei este “ << ra << endl;
// scrie adresa variabilei şi referintei
cout << “adresa variabilei este “ << &a << endl;
cout << “adresa referintei este ” << &ra << endl;
return 0;
}
Rezultatele execuţiei programului sunt cele de mai jos.
4.3Alocarea dinamică a memoriei
Alocarea memoriei unei variabile se face astfel
-
de către compilator, la declararea unei variabile de un tip oarecare în program,
-
cu funcţia malloc(),
-
cu operatorul new.
Alocarea memoriei cu funcţia malloc()
Alocarea memoriei unei variabile cu funcţia malloc sau operatorul new se face la execuţia programului.
Alocarea de memorie se poate face cu funcţia
void * malloc(int size);
unde size este numărul de octeţi de alocat. Tipul funcţiei este void* şi el trebuie convertit în pointer la tipul alocat. Eliberarea memoriei alocate cu funcţia malloc() se face cu funcţia
void free(p);
unde p este o variabilă tip pointer ce conţine adresa zonei de memorie ce va fi eliberate. Prototipul acestor funcţii se află în biblioteca , respectiv <cstdlib>.
Alocarea memoriei cu operatorul new
Alocarea de memorie pentru o variabilă sau pentru un vector se poate face cu operatorul new. Fie T tipul unei variabile. Operatorul new cu forma
new T
alocă memorie pentru o variabilă de tipul T, iar operatorul new cu forma
new T[n]
aloca memorie pentru un vector de tipul T cu n componente, unde n este un număr întreg. Operatorul new are ca rezultat un pointer la memoria alocată. Fie instrucţiunea
double *x, *y ;
Instrucţiunea
x = new double;
alocă memorie pentru o variabilă scalară de tip double, în timp ce instrucţiunea
y = new double[17] ;
alocă memorie pentru un vector cu 17 componente. Eliberarea memoriei alocate cu operatorul new se face cu operatorul delete. Instrucţiunea
delete x;
eliberează memoria alocată cu new double, în timp ce instrucţiunea
delete [] y;
eliberează memoria alocată vectorului cu new double[17].
4.4Probleme rezolvate
Problema 1. Se va aloca un vector de 5 componente tip double folosind operatorul new. Se vor citi componentele vectorului de la tastatură şi se va calcula suma componentelor. Sluţia problemei este următoarea.
# include
using namespace std;
int main(){
double * v = new double[5];
cout << "introduceti 5 numere " << endl;
for(int j = 0; j < 5; j++)
cin >> v[j];
double suma = 0;
for(int j = 0; j < 5; j++)
suma = suma + v[j];
cout << "suma : " << suma << endl;
delete [] v;
return 0;
}
Mai jos este reprodus un exemplu de execuţie.
Problema 2. Se va aloca un vector de 3 componente tip double folosind operatorul malloc. Se vor citi componentele vectorului de la tastatură şi se va calcula suma componentelor. Programul de rezolvare a problemei este prezentat mai jos.
# include
using namespace std;
# include
int main(){
double * v = (double *) malloc(3 * sizeof(double));
double s = 0;
cout << "Introduceti un sir de trei numere reale" << endl;
for(int i = 0; i < 3; i++) {
cin >> v[i];
s = s + v[i];
}
cout << "Suma numerelor este : " << s << endl;
free(v);
return 0;
}
Un exemplu de execuţie este următorul :
Dostları ilə paylaş: |