Documente Academic
Documente Profesional
Documente Cultură
Limbaje de
Programare
Curs 6 - Pointeri
Dan Novischi
Review
Ce este un
POINTER?
Declaratia unui
pointer Limbaje de Programare
Adresare si Curs 6 - Pointeri
Dereferntiere
Pointer NULL si
const
Pointeri Catre
Dan Novischi
Necunoscuti
Pointer vs Array
Aritmetica 1D
Aritmetica Multi-D
Pointeri ca
Parametri /
Argumente de
Functii
Observatii
Sumar
Limbaje de
Programare
Curs 6 - Pointeri
1 Review
Dan Novischi
2 Ce este un POINTER?
Review
3 Declaratia unui pointer
Ce este un
POINTER?
4 Adresare si Dereferntiere
Declaratia unui
pointer
5 Pointer NULL si const
Adresare si
Dereferntiere
6 Pointeri Catre Necunoscuti
Pointer NULL si
const
7 Pointer vs Array
Pointeri Catre
Necunoscuti
8 Aritmetica 1D
Pointer vs Array
Observatii
Review
Limbaje de
Programare Sistemul hexazecimal este utilizat in general pentru a putea distinge
Curs 6 - Pointeri
valorile scrise in binar, coversia intre cele doua sisteme fiind rapida.
Dan Novischi
Astfel, orice grup de 4 biti (un nibble) se poate reprezenta cu o singura
Review cifra hexazecimala.
Ce este un Reprezentarile numerelor intregi unsigned si signed in sistemul binar
POINTER?
folosesc aceleasi combinatii la nivel de bit. Pentru a afla reprezentarea
Declaratia unui unui numar negativ, data fiind cel pozitiv se aplica transformarea in
pointer
complement fata de doi.
Adresare si
Dereferntiere Numere reale sunt reprezentate in virgula mobila cu simpla precizie
Pointer NULL si (float) si dubla precizie double deoarece se doreste reprezentarea unui
const
interval de valori cat mai mare si cu o precizie cat mai buna.
Pointeri Catre
Necunoscuti Asupra numerelor intregi se pot aplica operatori care actioneaza la nivel
Pointer vs Array
de bit si sunt dati de doua clase: deplasari si logica la nivel de bit.
Aritmetica 1D Tablourile (Array-urile) sunt colectii de date cu acelasi tip si pot fi
Pointer vs Array
uni-dimesionale sau multi-dimensionale.
Multi-D
Declaratia acestora se realizeaza asemanator variabilelor furnizand in plus
Aritmetica Multi-D dimensiunea (sau dimesiunile in multi-dimesional).
Pointeri ca
Parametri / Accesul la elementele tabloului intr-o anumita dimensiune se realizeaza
Argumente de prin indexare, unde primul index are valoarea 0 iar ultimul dimensiune-1.
Functii
Limbaje de
Programare
Curs 6 - Pointeri In Cursul 1 am observat ca o variabila reprezinta in modul prin care ne
Dan Novischi
referim in mod simbolic intr-un program la o anumita locatie de memorie.
Ulterior (Cursul 4 si Cursul 5), am vazut ca fiecare locatie de memorie
Review
(RAM - Random Access Memory) are asociata o adresa unica prin
Ce este un
POINTER?
intermediul careia procesorul aduce date din memorie.
Declaratia unui Un pointer este un tip date care stocheaza adrese de memorie si prin
pointer intermediul caruia putem opera asupra adreselor sau asupra valorilor
Adresare si stocate la aceste adrese in mod indirect.
Dereferntiere
Pointer NULL si
const
Pointeri Catre
Necunoscuti
Pointer vs Array
Aritmetica 1D
Pointer vs Array
Multi-D
Aritmetica Multi-D
Pointeri ca
Parametri /
Argumente de
Functii
Observatii
Declaratia unui Pointer
Limbaje de
Programare
Curs 6 - Pointeri
Deoarece un pointer poate stoca adresa oricarei variabile indiferent de
Dan Novischi
tipul de date (incluzand cele definite de utilizator) pentru declararea unui
pointer avem urmatoarea forma:
Review
tip_date *nume_var_pointer;
Ce este un
POINTER? unde tip_date specifica orice tip valid de date al limbajului C, iar
Declaratia unui
*nume_var_pointer reprezinta numele pointer-ului.
pointer
Limbaje de
Programare
Curs 6 - Pointeri
Pentru obtinerea adresei unei variabile se utilizeaza operatorul de
Dan Novischi adresare: "&". Spre exemplu:
Review int a = 37; // declaratie variabila
Ce este un
int *pa; // declaratie pointer
POINTER? pa = &a; // asignare adresa
Declaratia unui unde &a se citeste: adresa variabilei a, iar aceasta adresa a fost atribuita
pointer
pointer-ului pa. Deci, pointer-ul pa stocheaza, in acest moment, adresa
Adresare si
Dereferntiere variabilei a.
Pointer NULL si In exemplul de mai sus, pentru a accesa valoarea variabilei a in mod
const
indirect prin intermediul pointer-ului pa vom folosi operatorul de
Pointeri Catre
Necunoscuti dereferentiere. Spre exemplu:
Pointer vs Array int *pa = &a; // intializare pointer la declaratie
Aritmetica 1D
*pa = 13; // dereferentiere pointer
printf("Valoare Indirecta: %d, Valoare Directa:", *pa, a);
Pointer vs Array
Multi-D unde *pa se citeste: valoarea de la adresa referentiata de pointerul pa.
Aritmetica Multi-D
Pointeri ca Observatii:
Parametri /
Argumente de NU confundati operatorul de adresare cu AND-ul logic la nivel de bit!
Functii
NU confundati declaratia pointerului cu operatorul de dereferentiere!
Functii care Intorc
Pointeri
Observatii
Exemplificare
Limbaje de
Programare
Curs 6 - Pointeri #include <stdio.h>
Dan Novischi int main(void){
int a = 15;
Review
int* pa;
Ce este un
POINTER?
printf("Adresa lui a: 0x%X\n",&a);
Declaratia unui
pointer printf("Valoarea lui a: %d\n\n",a);
Adresare si
Dereferntiere pa = &a;
Pointer NULL si printf("Adresa stocata de pa: 0x%X\n",pa);
const printf("Valoarea indicata de pa: %d\n\n",*pa);
Pointeri Catre
Necunoscuti
a = 30;
Pointer vs Array printf("Adresa stocata de pa: 0x%X\n",pa);
Aritmetica 1D printf("Valoarea indicata de pa: %d\n\n",*pa);
Pointer vs Array
Multi-D
*pa = 22;
Aritmetica Multi-D printf("Adresa lui a: 0x%X\n",&a);
Pointeri ca printf("Valoarea lui a: %d\n\n",a);
Parametri /
Argumente de
Functii return 0;
Functii care Intorc }
Pointeri
Observatii
Pointer NULL si const
Limbaje de
Programare De cele mai multe ori, vom vrea sa intializam un pointer la declaratie,
Curs 6 - Pointeri desi nu stim de la bun inceput o adresa valida. In aceste cazuri, un
Dan Novischi pointer poate fi initalizat la o adresa vida atribuindui valoarea NULL. Spre
exemplu:
Review
Ce este un
double *x = NULL;
POINTER? unde NULL este o constanta definita deobicei in libraria stdlib.h.
Declaratia unui
pointer Pointeri pot referentia si constante simbolice declarate folosind const.
Adresare si
Astfel, fiind vorba de o constanta, pentru a specifica faptul ca prin
Dereferntiere intermediul pointer-ului o anumita valoare nu se poate schimba,
Pointer NULL si declaratia acestuia va fi de asemenea precedata de cuvantul cheie const.
const Spre exemplu:
Pointeri Catre const int *pa = &a;
Necunoscuti
Pointer vs Array
specifica faptul ca prin intermediul lui pa nu se poate schimba valoarea
variabilei a, dar pointer-ul se poate schimba ulterior pentru a referentia
Aritmetica 1D
alta adresa.
Pointer vs Array
Multi-D Similar, pentru a declara un pointer constant – reprezentand un pointer a
Aritmetica Multi-D carui referenita nu poate fi schimbata – se poate utiliza o forma ca in
Pointeri ca exemplul urmator:
Parametri /
Argumente de
int const *pa = &a;
Functii
care specifica faptul ca pointer-ul nu poate fi schimbat astfel incat sa
Functii care Intorc referentieze alta adresa, dar prin intermediul lui se poate modifica indirect
Pointeri
valoarea variabilei a.
Observatii
Pointeri Catre Necunoscuti
Limbaje de
Programare O variabila pointer de un anumit tip de date nu poate sa stocheze adresa
Curs 6 - Pointeri
unei variabile cu alt tip de date. Spre exemplu:
Dan Novischi
double x = 0.1;
Review int *px = &x; // eroare la compilare
Ce este un va genera eroarea de compilare: "initialization from incompatible
POINTER?
pointer type".
Declaratia unui
pointer
Adresare si
Pentru a memora o adresa catre o variabila de orice tip ne trebuie un
Dereferntiere pointer la un tip necunoscut.
Pointer NULL si
const
In limabjul C un pointer la un tip necunoscut este desemnat de void
Pointeri Catre pointer – void*. Altfel spus, void* este un pointer generic care se poate
Necunoscuti
referi la orice adresa din memorie. Spre exemplu, in loc sa utilizam 3
Pointer vs Array
pointeri pentru a stoca succesiv 3 adrese de variabile cu tip diferit putem
Aritmetica 1D folosi un singur void*:
Pointer vs Array
Multi-D
char x; int y; double z;
void *p;
Aritmetica Multi-D
p = (void*) &x; // conversie char* la void*
Pointeri ca
Parametri /
p = (void*) &y; // conversie int* la void*
Argumente de p = (void*) &z; // conversie dobuble* la void*
Functii
unde conversia explicita a fost folosita pentru transformarea diferitelor
Functii care Intorc
Pointeri adrese la o adresa generica void*.
Observatii
Pointeri catre necunoscuti
Limbaje de
Programare
Curs 6 - Pointeri
Deoarece un pointer la tipul void (void*) stocheaza o adresa de memorie
Dan Novischi
fara a se referi propriu-zis la un anumit tip de date, acesta NU poate fi
Review dereferentiat direct. Dereferentierea directa va rezulta intr-o eroare,
Ce este un
deoarece NU exista o valoare de tip void.
POINTER?
Pointer NULL si
char a = *((char*) p);
const int b = *((int*) p);
Pointeri Catre double c = *((double*) p);
Necunoscuti
Pointer vs Array
Astfel pentru a lucra generic cu adrese vom declara un pointer void.
Aritmetica 1D Succesiv vom stoca adresele diverselor variabile converind de la adresa
Pointer vs Array catre un tip de date valid la una void* si invers, de la o adresa void* la
Multi-D
una catre un tip de date valid pentru a obtine valoarea.
Aritmetica Multi-D
Pointeri ca Acest mecanism reprezinta unul din pilonii limbajului C pe baza caruia se
Parametri /
Argumente de pot construi comportamente polimorfice (cu mai multe fete in functie de
Functii context) cum ar fi alocarea dinamica (din cursurile urmatoare).
Functii care Intorc
Pointeri
Observatii
Pointer vs Array Uni-Dimensional
Limbaje de
Programare
Curs 6 - Pointeri In Cursul 5 defineam array-urile ca o colectie de date de acelasi tip a carui
Dan Novischi
elemente sunt memorate in locatii de memorie succesive (intr-o zona de
memorie contigua). Altfel spus, elementele unui array sunt stocate in
Review locatii de memorie cu adrese succesive. Spre exemplu:
Ce este un
POINTER? int arr[5] = {-1, 1, 0, 2, -2};
Declaratia unui reprezinta un array de numere intregi ale carui elemente au adresele din
pointer
Figura de mai jos.
Adresare si
Dereferntiere
Pointer NULL si
const
Pointeri Catre
Necunoscuti
Pointer vs Array
unde primul element (aflat la indexul 0) &arr[0] are adresa 0xFFA4.
Aritmetica 1D
Pointer vs Array Totodata, numele unui array (in acest caz arr) reprezinta si adresa
Multi-D
primului element din array.
Aritmetica Multi-D
&arr[0] = arr
Pointeri ca
Parametri /
Argumente de Abuzand de notiunea de pointer, am putea spune ca: numele unui array
Functii
este in acelasi timp si un pointer, dar cele doua notiuni (array si pointer)
Functii care Intorc
Pointeri
sunt diferite.
Observatii
Pointer vs Array Uni-Dimensional
Limbaje de
Programare
Curs 6 - Pointeri Diferenta principala fiind faptul ca: un pointer poate referentia (sau
Dan Novischi poate fi schimbat catre) diverse adrese de memorie, in timp ce pentru un
array adresele de memorie sunt fixe.
Review
Ce este un Totusi, putem folosi inter-schimbabil cele doua noutiuni; in acest caz
POINTER?
putem folosi notiunea de pointer pentru a obtine valoarea primului
Declaratia unui
pointer
element:
Adresare si arr[0] = *arr
Dereferntiere
unde numele array-ului (care reprezinta adresa primului element) a fost
Pointer NULL si
const
dereferentiata, similar unui pointer, pentru a obtine valoarea de la adresa
indicata de acesta.
Pointeri Catre
Necunoscuti
Pointer vs Array
O alta consecinta este faptul ca: un pointer poate fi initializat direct cu
numele unui array. Spre exemplu:
Aritmetica 1D
int arr[5] = {-1, 1, 0, 2, -2};
Pointer vs Array
Multi-D int *p = arr;
Aritmetica Multi-D
Pointeri ca
Mai mult, un astfel de pointer poate fi indexat exact ca un array pentru
Parametri / a obtine valorile elementelor. In exemplul de mai sus ar fi valid daca am
Argumente de
Functii scrie:
Functii care Intorc printf("%d %d\n", arr[3], p[3]);
Pointeri
Observatii
Aritmetica Pointerilor Uni-Dimensionala
Limbaje de
Programare
Curs 6 - Pointeri
Dan Novischi
Deoarece un pointer stocheaza o adresa de memorie, care nu este altceva
Review
decat o valoare numerica care indentifica o anumita locatie din acea
memorie, asupra acesteia se pot aplica anumite operatii aritmetice.
Ce este un
POINTER?
Declaratia unui
Operatiile aritmetice care se pot aplica asupra unui pointer sunt:
pointer incrementarea (++), decrementarea (--), adunarea (+) si scaderea (-).
Adresare si
Dereferntiere Astfel, tinand cont de aceste operatii putem obtine valorile succesive
Pointer NULL si dintr-un array folosind doar numele acestuia. Spre exemplu, pentru
const
array-ul:
Pointeri Catre
Necunoscuti int arr[5] = {-1, 1, 0, 2, -2};
Pointer vs Array se pot obtine valorile din diversele pozitii atat prin indexare cat si prin
Aritmetica 1D utilizarea numelui array-ul pe post de pointer, avand urmatoarele forme
Pointer vs Array echivalente:
Multi-D arr[0] = *(arr + 0)
Aritmetica Multi-D arr[1] = *(arr + 1)
Pointeri ca arr[2] = *(arr + 2)
Parametri / arr[4] = *(arr + 4)
Argumente de
Functii
Observatii
Aritmetica Pointerilor Uni-Dimensionala
Limbaje de
Programare
Curs 6 - Pointeri
Anterior, spuneam ca tipul de date are un rol decisiv in aritmetica
Dan Novischi
pointerilor. Acest lucru se datoareaza lugimilor diferite in numar de bytes
Review
(sau octeti) pentru diverse tipuri de date (vezi Cursul 2). Spre exemplu:
Ce este un
POINTER?
Declaratia unui
pointer
Adresare si
Dereferntiere
Pointer NULL si
este un array de intregi de tip int a carui elemente au o lungime de 4
const octeti sizeof(int) = 4. Cea ce inseamna ca indexarea sau utilizarea
Pointeri Catre operatiilor aritmetice asupra numelui array-ului trebuie sa "sara" in
Necunoscuti
memorie la adrese din 4 in 4 bytes. Lucru care se si intampla!!! Adica:
Pointer vs Array
&arr[0] = arr = 0xFFA4
Aritmetica 1D
&arr[1] = arr + 1 = 0xFFA8
Pointer vs Array
Multi-D
Aritmetica Multi-D
Daca array-ul era definit ca fiind de tip double atunci adresele elementelor
erau obtinute prin salturi de cate 8 bytes (sizeof(double) = 8).
Pointeri ca
Parametri /
Argumente de In lucrul cu pointeri, mai ales cei generici void* trebuie avut in vedere
Functii
tipul de date cu care se lucreaza, altfel efectele pot fi dezastroase!
Functii care Intorc
Pointeri
Observatii
Aplicatie 1D
Limbaje de
Programare In cazul variabilelor si array-urilor 1D folosirea unui pointer ne permite sa
Curs 6 - Pointeri
obtinem indirect valorile stocate la adresele din memorie ale acestora.
Dan Novischi
Altfel spus, relativ la pointeri, este de ajuns un singur nivel de indirectare
Review pentru a opera asupra datelor utilizand adresele acestora — a.k.a. simplu
Ce este un
pointer.
POINTER?
In cazul array-urilor multi-dimensionale sau a "array-urilor de array-uri"
Declaratia unui
pointer
acest lucru NU mai este posibil.
Adresare si La fel cum la declararea unui array multi-dimesional putem defini oricate
Dereferntiere dimensiuni (iar indexarea se realizeaza in fiecare dimensiune) asa si
Pointer NULL si pentru pointeri este posibila folosirea mai multor nivele de indirectare —
const
a.k.a. dublu pointer, triplu pointer, s.a.m.d.
Pointeri Catre
Necunoscuti Sa luam cazul array-ului 2D (matrice) definit in cursul trecut:
Pointer vs Array float mat[4][3] = { { 1.0, 1.0, 1.0},
Aritmetica 1D { 1.0, 1.0, 1.0},
Pointer vs Array
{ 1.0, 1.0, 1.0},
Multi-D { 1.0, 1.0, 1.0} };
Aritmetica Multi-D Daca am incerca sa intializam un (simplu) pointer folosind numele
Pointeri ca array-ului:
Parametri /
Argumente de float *pmat = mat;
Functii
compilatorul ne va genera mesajul:
Functii care Intorc
Pointeri "initialization from incompatible pointer type".
Observatii
Pointer vs Array Multi-Dimensional
Limbaje de
Programare Pentru a rezolva aceasta problema va trebui sa folosim inca un nivel de
Curs 6 - Pointeri
indirectare. Sintaxa generica pentru cazul 2D este:
Dan Novischi
float **nume_pointer;
Review
care foloseste doua nivele de indirectare sau altfel spus, defineste un
Ce este un
POINTER?
pointer la un alt pointer.
Declaratia unui In cazul definitei de matrice forma corecta fiind:
pointer
float **pmat = mat;
Adresare si
Dereferntiere unde dublul pointer pmat referentiaza simplu pointer *pmat care
Pointer NULL si referentiaza elementul de la adresa indicata de &mat[0][0] sau mat.
const
Pointeri Catre
Necunoscuti
Pointer vs Array
Aritmetica 1D
Pointer vs Array
Multi-D
Aritmetica Multi-D
Pointeri ca
Parametri /
Argumente de Evident, putem extinde notiunea la oricate nivele de indirectare dorim.
Functii
Spre exemplu pentru 3 nivele de indirectare sintaxa generica este:
Functii care Intorc
Pointeri float ***nume_pointer;
Observatii
Aritmetica Pointerilor Multi-Dimensionala
Limbaje de
Programare
Curs 6 - Pointeri Ca si in cazul array-urilor 1D, cele multi-dimesionale sunt stocate la intr-o
Dan Novischi zona contigua de memorie, numele array-ului multi-D poate fi folosit ca
un pointer, lugimile tipurilor de date isi pastreaza semnificatia si asupra
Review
unui pointer cu multiple nivele de indirectare se pot folosi operatii
Ce este un aritmetice de: incrementare, decrementare, adunare sau scadere.
POINTER?
Declaratia unui
pointer
Spre exemplu, pentru matricea definta anterior avem urmatoarea
echivalenta:
Adresare si
Dereferntiere mat[0][0] == *(*mat)
Pointer NULL si
const
Pentru obtirea valorilor elementelor utilizand numai notiunea de pointer
Pointeri Catre
Necunoscuti avem urmatoarele posibilitati:
Pointer vs Array mat[0][0] = *(*(mat + 0) + 0) = *(*mat + 0*3 + 0);
Aritmetica 1D
mat[0][1] = *(*(mat + 0) + 1) = *(*mat + 0*3 + 1);
...
Pointer vs Array
Multi-D mat[2][1] = *(*(mat + 2) + 1) = *(*mat + 2*3 + 1);
Aritmetica Multi-D ...
Pointeri ca
mat[3][2] = *(*(mat + 3) + 2) = *(*mat + 3*3 + 2);
Parametri /
Argumente de
Functii In general folosind indecsii (i,j) pentru m linii si n coloane avem:
Functii care Intorc mat[i][j] = *(*(mat + i) + j) = *(*mat + i*n + j);
Pointeri
Observatii
Aplicatie Multi-D
Limbaje de
Programare Similar variabilelor, pointerii pot fi definiti ca parametrii de functii si
Curs 6 - Pointeri
respecta aceleasi notiuni de localitate. Spre exemplu am putea defini
Dan Novischi
functia max(...) din Cursul 4 astfel:
Review double max(double *x, double *y){
Ce este un
return (*x > *y) ? (*x):(*y);
POINTER? }
Declaratia unui unde parametrii functiei sunt pointeri la tipul double, iar valorile indicate
pointer
de acestia sunt obtinute prin dereferentiere.
Adresare si
Dereferntiere
Pentru a apela functia va trebui sa furnizam argumente valide, cea ce
Pointer NULL si
const
inseamna ca in acest caz trebuie sa furnizam adresele a doua variabile
double. Spre exemplu:
Pointeri Catre
Necunoscuti double a = 3, b = 8;
Pointer vs Array ...
Aritmetica 1D
double ret = max(&a, &b);
Pointer vs Array
unde functiei i s-au transmis adresele variabilelor a si b.
Multi-D
Aritmetica Multi-D De asemenea, am fi putut declara aditional doi pointeri pe care ulterior sa
Pointeri ca
ii transmitem ca argumente functiei:
Parametri / double a = 3, b = 8;
Argumente de
Functii double *pa = &a, *pb = &b;
Functii care Intorc
...
Pointeri double ret = max(pa, pb);
Observatii
Pointeri ca Parametri/Argumente de Functii
Limbaje de
Programare
Curs 6 - Pointeri
In Cursul 4 am vazut ca argumetele sunt transmise functiilor prin valoare,
cea ce inseameana ca functiile opereazea asupra unor copii ale acestor
Dan Novischi
argumente si orice schimbare adusa acestora in cadrul unei functii nu este
Review vizibil in afara acesteia.
Ce este un
POINTER? Acest lucru este valabil si pentru functii definite cu parametrii de tip
Declaratia unui pointer, numai ca argumentele lor reprezinta copii ale unor adrese de
pointer
memorie. Prin urmare, schimbarea adreselor de memorie, prin intermediul
Adresare si pointerilor, in cadrul functiei nu va fi vizibila si inafara acesteia.
Dereferntiere
Pointer NULL si
const
Acest proces de furnizare a argumentelor unei functii se numeste
mecanisim de trasmitere a argumentelor prin refereninta.
Pointeri Catre
Necunoscuti
Pointer vs Array
Problema care se pune este: ce se intampla cu valorile referentiate de
pointeri in cadrul functiilor?
Aritmetica 1D
Pointer vs Array
Multi-D
Astfel, pentru a exmplifica vom urmari ce se intampla la executia unei
functii swap(...):
Aritmetica Multi-D
void swap(int* x, int* y){
Pointeri ca
Parametri / int aux = *x;
Argumente de
Functii
int *x = *y;
int *y = aux;
Functii care Intorc
Pointeri }
Observatii
Pointeri ca Parametri/Argumente de Functii
Limbaje de
Programare
Curs 6 - Pointeri
Dan Novischi
Review
Ce este un
POINTER?
Declaratia unui
pointer
Adresare si
Dereferntiere
Pointer NULL si
const
Pointeri Catre
Necunoscuti
Pointer vs Array
Pointerii pa si pb sunt initializati cu adresele a doua variablie a si b.
Aritmetica 1D
Pointer vs Array
pa si pb sunt transmisi ca argumente functiei swap(...). Astfel pointerii
Multi-D x si y arata catre acelasi adrese.
Aritmetica Multi-D Valoarea de la adresa indicata de x este salvata intr-o variabila locala
Pointeri ca denumita aux.
Parametri /
Argumente de Valoarea de la adresa indicata de x este schimbata cu cea de la adresa
Functii indicata de y.
Functii care Intorc
Pointeri
Valoarea de la adresa indicata de y este schimbata cu cea data de
variabila aux.
Observatii
Pointeri ca Parametri/Argumente de Functii
Limbaje de
Programare
Curs 6 - Pointeri Dupa cum am vazut, intre array-uri si pointeri exista o legatura stransa
Dan Novischi ceea ce ne permite sa ii folosim inter-schimbabil tinand cont de aritmetica
cu pointeri.
Review
Ce este un Din punct de vedere al functiilor orice array care reprezinta parametru al
POINTER?
unei functii este converit automat la un pointer.
Declaratia unui
pointer
Astfel, in declaratia parametriilor unei functii putem folosi direct sintaxa
Adresare si
Dereferntiere
pointerilor in loc de cea a array-urilor. Spre exemplu, functia care
determina maximul dintr-un vector de numere reale poate fi scrisa si
Pointer NULL si
const astfel:
Pointeri Catre double maximum(double *arr, int n){
Necunoscuti
double m = arr[0];
Pointer vs Array for(int i = 1; i < n; i++){
Aritmetica 1D if(m < arr[i]){
Pointer vs Array m = arr[i];
Multi-D }
Aritmetica Multi-D }
Pointeri ca return m;
Parametri /
Argumente de
}
Functii unde parametrul arr este un pointer la tipul double si este folosit prin
Functii care Intorc indexare ca un array in cadrul functiei.
Pointeri
Observatii
Pointeri ca Parametri/Argumente de Functii
Limbaje de
Programare Evident putem extinde aceasta sintaxa la array-uri multi dimesionale prin
Curs 6 - Pointeri multipla indirectare.
Dan Novischi
Tinand cont de mecanismul de transmitere a paramentrilor prin referinta,
Review
am putea spre exemplu crea o functie care calculeaza transpusa unei
Ce este un matrici (care in Cursul 5 era realizata in programul principal):
POINTER?
#include <stdio.h>
Declaratia unui
pointer void transpose(double **a, int rows, int cols, double **tr){
Adresare si for(int i = 0; i < rows; i++)
Dereferntiere for(int j = 0; j < cols; j++)
Pointer NULL si tr[j][i] = a[i][j];
const
}
Pointeri Catre
Necunoscuti
int main(void){
Pointer vs Array
double x[100][100], tr[100][100];
Aritmetica 1D
int m,n;
Pointer vs Array // Citire dimesiuni ...
Multi-D
// Citire matrice ...
Aritmetica Multi-D
Limbaje de
Programare Functiile pot returna orice tip valid de date. Prin urmare, orice functie
Curs 6 - Pointeri
poate fi definita ca returnand un pointer.
Dan Novischi
Dupa cum am aflat in Cursul 4 orice variabila locala unui bloc de
Review instructiuni, inclusiv cele locale unor functii, se distrug odata cu
Ce este un terminarea executiei acelui bloc sau a functiei in cauza.
POINTER?
Astfel, returnarea unui pointer local unei functii va avea cele mai negative
Declaratia unui
pointer
efecte in cadrul unui program.
Adresare si Momentan, pentru a evita acesta problema, un pointer local trebuie
Dereferntiere
prefatat cu static pentru a fi persistent inafara blocului de instructiuni
Pointer NULL si care formeaza corpul functiei. In Cursul 8 vom vedea ca aceasta problema
const
poate fi usor rezolvata prin alocarea dinamica a unei zone de memorie.
Pointeri Catre
Necunoscuti Spre exemplu, functia pentru transpunerea unei matrici se poate scrie
Pointer vs Array astfel:
Aritmetica 1D double** transpose(double **a, int rows, int cols){
Pointer vs Array static double tr[100][100];
Multi-D for(int i = 0; i < rows; i++)
Aritmetica Multi-D for(int j = 0; j < cols; j++)
Pointeri ca tr[j][i] = a[i][j];
Parametri /
Argumente de
return tr;
Functii }
Functii care Intorc unde matricea tr este persistenta in memorie si continua sa existe intre
Pointeri
executiile succesive ale blocului de instructiuni din cadrul functiei.
Observatii
Aplicatie
Limbaje de
Programare Realizati un program pentru calculul traspusei unei matrici utilizand functia
Curs 6 - Pointeri anterioara:
Dan Novischi
#include <stdio.h>
Review double** transpose(double **a, int rows, int cols);
Ce este un
int main(void){
POINTER? double a[100][100];
Declaratia unui double **tr;
pointer
int m, n;
Adresare si // Citire dimensiuni ...
Dereferntiere
// Citire matrice ...
Pointer NULL si
const
Pointeri Catre
tr = transpose(a, m, n);
Necunoscuti
Limbaje de
Programare Parametrii de tip pointer a unei functii primesc intodeauna ca argumente
Curs 6 - Pointeri
adresele unor locatii de memorie.
Dan Novischi
In cazul variabilelor argumentele trebuie transmise utilizand operatorul de
Review adresare, care inseamna adresa unei anumite variabile.
Ce este un
POINTER?
Deoarece numele unui array 1D reprezinta implicit adresa primului
element, trasmiterea acestuia ca argument la functie se realizeaza
Declaratia unui
pointer utilizand doar numele.
Adresare si Daca o functie NU modifica anumite valori prin intermediul unui pointer
Dereferntiere
definit ca parametru, atunci este o buna practica ca paramentru in cauza
Pointer NULL si
const
sa fie prefatat de cuvantul cheie const.
Pointeri Catre Aplicarea operatorului de adresare asupra unui array 1D (*arr) utilizand
Necunoscuti doar numele (ex: &arr) reprezinta o dubla indirectare.
Pointer vs Array
In general, aplicarea operatorului de adresare asupra unui pointer
Aritmetica 1D reprezinta adresa pointer-ului si NU cea a valorii.
Pointer vs Array
Multi-D
Aplicarea operatorului de adresare asupra unui array indexat este
echivalent cu obtinerea adresei prin adunarea pointer-ului cu un offset
Aritmetica Multi-D
(deplasament) si dereferentiarea corespunzatoare pana la penultimul nivel.
Pointeri ca
Parametri / &arr[1] <=> arr + 1
Argumente de
Functii
&arr[2][3] <=> (*(arr + 2) + 3)
&arr[1][4][2] <=> (*(*(arr + 1) + 4) + 2)
Functii care Intorc
Pointeri Dintr-o functie NU trebuie returnat niciodata un pointer local acesteia.
Observatii