Documente Academic
Documente Profesional
Documente Cultură
Curs 3
Curs 3
tip * nume;
- tip poate fi int, char, float, string, array, object,
etc
- semnific faptul c pointerul nume va pstra
adresa de memorie pentru o variabil de acel
tip
- simbolul * este indicativul pentru pointer
- apar doi operatori specifici n lucrul cu pointerii
- & - operatorul de referin (de adresare)
- * - operatorul de dereferin (de indirectare)
- operatorul de referin & n faa unei variabile
indic extragerea adresei de memorie a acelei
variabile
- operatorul de dereferin * se plaseaz
ntotdeauna n faa unui pointer
int * p; // se declar un pointer p de tip ntreg
int a; // se declar o variabila a de tip ntreg
a=10; // se atribuie valoarea de 10 variabilei a
p = &a; //se atribuie pointerului p adresa de
memorie a variabilei a (op. de referin &)
*p = 5; //se pune n adresa de memorie din
pointerul p valoarea 5
cout<<a; // variabila a are valoarea 5
- prin intermediul pointerilor avem acces direct
la valorile variabilelor
- aceste valori pot fi modificate
- int * p; aceast instruciune definete un
pointer cu numele p
- n cod prin p se nelege variabila pointer (care
conine adresa de memorie), iar prin *p se
nelege coninutul aflat la adresa de memorie
- ntotdeauna tipul pointerului declarat trebuie
s coincid cu tipul variabilei a crei adres o
conine
int * p;
float a = 2.56;
p = &a; // instruciune invalid (tipul pointerului
nu coincide cu tipul variabilei)
float * p;
float a = 2.56;
p = &a;
cout<<valoarea lui a =<<a;
cout<<valoarea lui &a =<<&a;
cout<<valoarea lui p =<<p;
cout<<valoarea lui *p =<<*p;
dup compilare i executare se va afia
int * p[3];
- declararea acestuia
int **p;
#include <iostream>
using namespace std;
int main ()
{
int a;
int *p;
int **pp;
a = 10;
p = &a;
pp = &p;
cout << "valoarea lui a :" << a;
cout << "valoarea lui *p :" << *p;
cout << "valoarea la **pp:"<<**pp;
return 0;
}
cnd codul este compilat i executat se obine
rezultatul:
valoarea lui a = 10
valoarea lui *p = 10
valoarea la **pp = 10
Transmiterea unui pointer ctre o funcie
- se declar parametrul funciei ca fiind unul de
tip pointer
- se poate modifica valoarea unei variabile
transmise printr-un pointer de ctre o funcie
#include <iostream>
#include <ctime>
using namespace std;
void preiaSecunde(unsigned long int *p);
int main ()
{
unsigned long int secunde;
preiaSecunde(&secunde);
cout << "numrul de secunde:" << secunde;
return 0;
}
void preiaSecunde(unsigned long int *p)
{
*p = time( NULL );
return;
}
cnd codul este compilat i executat se obine
rezultatul:
numrul de secunde :1294450468
- o funcie care accept un pointer ca argument
poate accepta i un ir ca argument
#include <iostream>
using namespace std;
double preiaMedia(int *p, int marime);
int main ()
{
int sir[5] = {1, 2, 3, 4, 5};
double media;
media = preiaMedia (sir, 5 ) ;
cout << "valoarea medie este: "<<media;
return 0;
}
double preiaMedia(int *p, int marime)
{
int i, suma = 0;
double media;
for (i = 0; i < marime; i++)
{
suma += p[i];
}
media = double(suma)/marime;
return media;
}
cnd codul este compilat i executat se
obine rezultatul:
valoarea medie este : 3
- un nume de ir reprezint un pointer constant
care are ca adres primul element al irului
double sir[10];
sir este considerat un pointer la adresa &sir[0],
care este adresa primului element din irul sir
double *p;
double sir[10];
p = sir;
- este corect utilizarea numelui irului n loc de
pointer constant i viceversa
- este corect urmtoarea echivalare
*(sir + 4) = sir[4]
- elementele irului pot fi accesate cu ajutorul
pointerilor, folosind *p, *(p+1), *(p+2) etc.
#include <iostream>
using namespace std;
int main ()
{
int sir[5] = {1, 2, 3, 4, 5};
int *p;
p = sir;
cout << "valorile irului utiliznd pointeri ";
for ( int i = 0; i < 5; i++ )
{
cout << "*(p + " << i << ") : ";
cout << *(p + i);
}
cout << "valorile irului utiliznd adresa";
for ( int i = 0; i < 5; i++ )
{
cout << "*(sir + " << i << ") : ";
cout << *(sir + i) <<;
}
return 0;
}
cnd codul este compilat i executat se obine
rezultatul:
valorile irului utiliznd pointeri
*(p + 0) : 1
*(p + 1) : 2
*(p + 2) : 3
*(p + 4) : 5
valorile irului utiliznd adresa
*(sir + 0) : 1
*(sir + 1) : 2
*(sir + 2) : 3
*(sir + 3) : 4
*(sir + 4) : 5
- nu se poate transmite ca argument unei funcii
un ntreg ir
- se poate transmite un pointer la un ir
specificndu-se numele irului fr vreun index
- pentru a transmite ca argument unei funcii
un ir unidimensional exist trei variante
acceptabile
ca un pointer
void Functie (int *argument)
{
...
}
ca un ir cu dimensiunea menionat
ca un ir fr dimensiune
void Functie (int argument[ ])
{
...
}
#include <iostream>
using namespace std;
double preiaMedia(int a[ ], int marime);
int main ()
{
int sir[5] = {1, 2, 3, 4, 5};
double media;
media = preiaMedia (sir, 5 ) ;
cout << "valoarea medie este: "<<media;
return 0;
}
double preiaMedia(int a[ ], int marime)
{
int i, suma = 0;
double media;
for (i = 0; i < marime; i++)
{
suma += a[i];
}
media = double(suma)/marime;
return media;
}
cnd codul este compilat i executat se
obine rezultatul:
valoarea medie este : 3
Returnarea unui ir de ctre o funcie
- nu este permis returnarea unui ntreg ir de
ctre o funcie
- se poate returna un pointer ctre un ir prin
specificarea numelui irului fr niciun index
- pentru returnarea unui ir unidimensional,
trebuie s se declare c funcia returneaz un
pointer
- analog cu returnarea irului de ctre o funcie
se poate returna i un pointer
int * Functie ()
{ ...
}
- nu este permis returnarea adresei ctre o
variabil local n afara funciei
- variabila local trebuie declarat ca fiind static
#include <iostream>
#include <ctime>
using namespace std;
int * genAleatoare( )
{
static int r[5];
srand( (unsigned)time( NULL ) );
for (int i = 0; i < 5; i++)
{
r[i] = rand();
cout << r[i];
}
return r;
}
int main ()
{
int *p;
p = genAleatoare();
for ( int i = 0; i < 5; i++ )
{
cout << "*(p + " << i << ") : ";
cout << *(p + i) << ;
}
return 0;
}
cnd codul este compilat i executat se obine
rezultatul:
624723190
1468735695
807113585
976495677
613357504
*(p + 0) : 624723190
*(p + 1) : 1468735695
*(p + 2) : 807113585
*(p + 3) : 976495677
*(p + 4) : 613357504
Referine
- o variabil referin este un alias, adic un alt
nume pentru o variabil deja existent
- odat ce o referin este iniializat cu o
variabil, atunci se poate utiliza fie numele
variabilei fie numele referinei
new tip_data;
#include <iostream>
using namespace std;
int main ()
{
double* p = NULL;
p = new double;
*p = 29494.99;
cout << "valoarea lui p : " << *p;
delete p;
return 0;
}
dup compilare i rulare rezultatul este
valoarea lui p : 29494.99
- memoria se poate aloca dinamic i pentru
iruri
- pentru un ir de 10 elemente (caractere)
char* p = NULL;
p = new char[10];
- pentru a elibera memoria
delete [ ] p;
- pentru un ir bidimensional
double** p = NULL;
p = new double [3][4];
- pentru eliberarea memoriei
delete [ ] p;
Generarea numerelor aleatoare
- numere aleatoare reale
-numere pseudo-aleatoare
- se utilizeaz biblioteca #include<cstdlib> care
conine funcia rand()
-se pot genera numere pseudo-aleatoare ntre
0 i 32.767 (numere ntregi). Valoarea depinde
de bibliotec, dar este cel puin 32.727.
-valoarea real pentru fiecare compilator este
dat de RAND_MAX. Reprezint valoarea
maxim returnat de funcia rand().
-se verific valoarea acestuia prin comanda
cout<<RAND_MAX =<<RAND_MAX;