Sunteți pe pagina 1din 28

Limbaje de Programare

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

Pointer vs Array 28 Mar


Multi-D

Aritmetica Multi-D

Pointeri ca
Parametri /
Argumente de
Functii

Functii care Intorc


Pointeri

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

Aritmetica 1D 9 Pointer vs Array Multi-D


Pointer vs Array
Multi-D 10 Aritmetica Multi-D
Aritmetica Multi-D
11 Pointeri ca Parametri / Argumente de Functii
Pointeri ca
Parametri /
Argumente de
12 Functii care Intorc Pointeri
Functii

Functii care Intorc


13 Observatii
Pointeri

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

Functii care Intorc


Initializarea tablourilor se realizeaza cu ajutor listelor de initializare in
Pointeri momentul declaratiei sau ulterior accesand fiecare element in parte.
Observatii
Ce este un POINTER?

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

Functii care Intorc


Pointeri

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

Adresare si Observati ca sigura diferenta intre declaratia unei variabile obisnuite si un


Dereferntiere
pointer este faptul ca la declaratia pointer-ului numele acestuia este
Pointer NULL si
const
precedat de asterix (semnul de inmultire).
Pointeri Catre
Necunoscuti Un pointer are o lungime fixa – 4 octeti pe 32-biti sau 8 octeti pe 64-biti
Pointer vs Array
– indiferent de tipul de date, deoarece adresele de memorie se pot
Aritmetica 1D
reprezenta pe un numar finit de octeti. Spre exemplu, toate declaratiile
de mai jos reprezinta pointeri de acceasi lungime:
Pointer vs Array
Multi-D int *ip; /* pointer la int */
Aritmetica Multi-D double *dp; /* pointer la double */
Pointeri ca float *fp; /* pointer la float */
Parametri /
Argumente de
char *ch /* pointer la char */
Functii
Tipul de date are un rol decisiv in aritmetica pointerilor pe care o vom
Functii care Intorc
Pointeri
discuta un pic mai incolo.
Observatii
Adresare si Dereferntiere

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?

Declaratia unui Pentru a obtine valoarea referentiata de un astfel de pointer va trebui sa


pointer
converitm pointer-ul la un pointer catre un tip de date valid si apoi sa il
Adresare si dereferentiem. Relativ la exemplul anterior acest lucru se poate scrie ca:
Dereferntiere

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

Functii care Intorc


Pointeri

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 Scrieti o functie care implementeaza algoritmul de cautare binara a unui


Programare
Curs 6 - Pointeri
element intr-un array de numere reale sortat (ex: float a[] = {-12.1,
Dan Novischi
2.73, 3.14, 7}), accesand elementele array-ului utilizand numai notiunea de
pointer.
Review
int binarySearch(float arr[], float x, int n){
Ce este un
POINTER?
int mid, left, right;
Declaratia unui
pointer left = 0;
Adresare si right = n - 1;
Dereferntiere

Pointer NULL si do{


const
mid = (left + right)/2; // sau mid = left + (right - left)/2;
Pointeri Catre
Necunoscuti
if(x == *(arr + mid)){
Pointer vs Array
return mid;
Aritmetica 1D
}else if(x < *(arr + mid)){
Pointer vs Array right = mid - 1;
Multi-D
}else{
Aritmetica Multi-D
left = mid + 1;
Pointeri ca }
Parametri /
Argumente de }while(left <= right);
Functii

Functii care Intorc return -1;


Pointeri
}
Observatii
Aplicatie 1D

Limbaje de Realizati un program care sorteaza un array de numere intregi utilizand


Programare
Curs 6 - Pointeri metoda bulelor. Accesul la elementele array-ului se va realiza exclusiv folosind
Dan Novischi
notiunea pointer.
#include <stdio.h>
Review
int main(void){
Ce este un
POINTER?
int array[100], n, swap;
printf("n = "); scanf("%d", &n);
Declaratia unui
pointer printf("Introduceti %d intregi\n", n);
Adresare si for (int i = 0; i < n; i++)
Dereferntiere scanf("%d", (array + i));
Pointer NULL si for(int i = 0 ; i < ( n - 1 ); i++){
const
for(int j = 0 ; j < n - i - 1; j++){
Pointeri Catre if(*(array + j) > *(array + j + 1)){
Necunoscuti
swap = *(array +j);
Pointer vs Array
*(array + j) = *(array + j + 1);
Aritmetica 1D *(array + j + 1) = swap;
Pointer vs Array }
Multi-D
}
Aritmetica Multi-D
}
Pointeri ca printf("Elementele sortate ascendent: ");
Parametri /
Argumente de for (int i = 0; i < n; i++)
Functii
printf("%d ", *(array + i));
Functii care Intorc return 0;
Pointeri
}
Observatii
Pointer vs Array Multi-Dimensional

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 Traspusa unei matrici de m linii si n coloane folosind numai notiunea de


Programare
Curs 6 - Pointeri pointeri:
Dan Novischi #include <stdio.h>
int main(void){
Review
int a[10][10], transpose[10][10], rows, col;
Ce este un
POINTER?
// Citire linii si coloane ...
Declaratia unui
pointer

Adresare si // Citire matrice ...


Dereferntiere

Pointer NULL si for(int i = 0; i < rows; i++){


const
for(int j = 0; j < col; j++){
Pointeri Catre *(*transpose + j*rows + i) = *(*a + i*col + j);
Necunoscuti
}
Pointer vs Array
}
Aritmetica 1D

Pointer vs Array printf("\nMatricea Transpusa:\n");


Multi-D
for(int i = 0; i < col; i++){
Aritmetica Multi-D
for(int j = 0; j < rows; j++){
Pointeri ca printf("%d ", *(*transpose + i*rows + j));
Parametri /
Argumente de }
Functii
}
Functii care Intorc return 0;
Pointeri
}
Observatii
Pointeri ca Parametri/Argumente de Functii

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

Pointeri ca tanspose(a, m, n, tr);


Parametri /
Argumente de
Functii
// Afisarea matricii traspuse ...
Functii care Intorc return 0;
Pointeri
}
Observatii
Functii care intorc pointeri

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

Pointer vs Array // Afisare matrice transpusa ...


Aritmetica 1D
return 0;
}
Pointer vs Array
Multi-D double** trasnspose(double **a, int rows, int cols){
Aritmetica Multi-D
static double tr[100][100];
for(int i = 0; i < rows; i++)
Pointeri ca
Parametri / for(int j = 0; j < cols; j++)
Argumente de
Functii
tr[j][i] = a[i][j];
return tr;
Functii care Intorc
Pointeri }
Observatii
Observatii

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

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

  • Smart Cities
    Smart Cities
    Document5 pagini
    Smart Cities
    Camer Aptula
    Încă nu există evaluări
  • Realitate Virtuala in Medicina - Asc
    Realitate Virtuala in Medicina - Asc
    Document5 pagini
    Realitate Virtuala in Medicina - Asc
    Camer Aptula
    Încă nu există evaluări
  • Infrastructura Deschisă Pentru Rezultate (ASC)
    Infrastructura Deschisă Pentru Rezultate (ASC)
    Document6 pagini
    Infrastructura Deschisă Pentru Rezultate (ASC)
    Camer Aptula
    Încă nu există evaluări
  • Realitate Virtuala in Medicina - Asc
    Realitate Virtuala in Medicina - Asc
    Document7 pagini
    Realitate Virtuala in Medicina - Asc
    Camer Aptula
    Încă nu există evaluări
  • Metodologie Acs
    Metodologie Acs
    Document5 pagini
    Metodologie Acs
    Camer Aptula
    Încă nu există evaluări
  • Metodologie Acs
    Metodologie Acs
    Document5 pagini
    Metodologie Acs
    Camer Aptula
    Încă nu există evaluări
  • TEMA Finala ASC
    TEMA Finala ASC
    Document1 pagină
    TEMA Finala ASC
    Camer Aptula
    Încă nu există evaluări
  • Smart City
    Smart City
    Document4 pagini
    Smart City
    Camer Aptula
    Încă nu există evaluări
  • Ia2 L3
    Ia2 L3
    Document18 pagini
    Ia2 L3
    Cristian Mihai
    Încă nu există evaluări
  • IA2 L1 PDF
    IA2 L1 PDF
    Document22 pagini
    IA2 L1 PDF
    Mihai Gatea
    100% (1)
  • ASC - Sectiune2 - L1 - Prez IDE - Ex
    ASC - Sectiune2 - L1 - Prez IDE - Ex
    Document51 pagini
    ASC - Sectiune2 - L1 - Prez IDE - Ex
    Camer Aptula
    Încă nu există evaluări
  • Lab 11
    Lab 11
    Document2 pagini
    Lab 11
    Camer Aptula
    Încă nu există evaluări
  • L2. Functii MATLAB de Interes General. Functii Matematice Uzuale. Reprezentarea Graficelor
    L2. Functii MATLAB de Interes General. Functii Matematice Uzuale. Reprezentarea Graficelor
    Document18 pagini
    L2. Functii MATLAB de Interes General. Functii Matematice Uzuale. Reprezentarea Graficelor
    Camer Aptula
    Încă nu există evaluări
  • Lab 12
    Lab 12
    Document1 pagină
    Lab 12
    Camer Aptula
    Încă nu există evaluări
  • LP Curs12
    LP Curs12
    Document19 pagini
    LP Curs12
    Camer Aptula
    Încă nu există evaluări
  • LP Curs12
    LP Curs12
    Document19 pagini
    LP Curs12
    Camer Aptula
    Încă nu există evaluări
  • Lab 10
    Lab 10
    Document2 pagini
    Lab 10
    Camer Aptula
    Încă nu există evaluări
  • LP Curs9
    LP Curs9
    Document32 pagini
    LP Curs9
    Camer Aptula
    Încă nu există evaluări
  • Lab 07
    Lab 07
    Document2 pagini
    Lab 07
    Camer Aptula
    Încă nu există evaluări
  • Lab 10
    Lab 10
    Document2 pagini
    Lab 10
    Camer Aptula
    Încă nu există evaluări
  • Lab 12
    Lab 12
    Document1 pagină
    Lab 12
    Camer Aptula
    Încă nu există evaluări
  • LP Curs10
    LP Curs10
    Document15 pagini
    LP Curs10
    Camer Aptula
    Încă nu există evaluări
  • Lab 09
    Lab 09
    Document3 pagini
    Lab 09
    Camer Aptula
    Încă nu există evaluări
  • Lab 06
    Lab 06
    Document2 pagini
    Lab 06
    Camer Aptula
    Încă nu există evaluări
  • Lab 04
    Lab 04
    Document2 pagini
    Lab 04
    Camer Aptula
    Încă nu există evaluări
  • Lab 05
    Lab 05
    Document3 pagini
    Lab 05
    Camer Aptula
    Încă nu există evaluări
  • LP Curs8 PDF
    LP Curs8 PDF
    Document25 pagini
    LP Curs8 PDF
    Camer Aptula
    Încă nu există evaluări
  • LP Curs8 PDF
    LP Curs8 PDF
    Document25 pagini
    LP Curs8 PDF
    Camer Aptula
    Încă nu există evaluări
  • LP Curs5 PDF
    LP Curs5 PDF
    Document29 pagini
    LP Curs5 PDF
    Camer Aptula
    Încă nu există evaluări