Sunteți pe pagina 1din 4

Laborator 6 - Pointeri

Un pointer este o variabilă care poate să păstreze adresele de memorie la care sunt
depozitate diverse entități, ce pot fi variabile, constante, pointeri sau funcții. Vom spune că
un pointer indică o anumită entitate, dacă valoarea lui reprezintă adresa de memorie a
entității.
Un pointer este o variabilă care are ca valori adrese altor variabile, sau mai general
adrese de memorie.

&E

Prin utilizarea corectă a pointerilor se poate îmbunătăți drastic eficiența și


performanțelor programului. Pe de altă parte utilizarea lor incorectă duce la apariția multor
probleme, de la cod greu de citit la greșeli de genul pierderi de memorie sau depășirea unei
zone de date. Utilizarea incorectă a pointerilor poate expune programul atacurilor externe
(hacking).
O locație de memorie are o adresă și un conținut. Pe de altă parte, o variabilă
este o locație de memorie care are asociat un nume și care poate stoca valoare de un tip
particular.
O variabilă pointer este o variabilă care păstrează adresa unei date, nu valoarea
date.
Pentru declararea unui pointer se folosește sintaxa următoare:
tip_de_bază listă_declaratori

tip_de_bază - specifică tipul de bază al pointerilor, care trebuie să coincidă cu tipul


entităților pe care le vor indica. Acesta poate fi orice tip de bază sau void.
lista_declaratori - este alcătuită din elemente de forma:
*nume
*nume[exp_dimopt]
*nume[exp_dim_1opt][ exp_dim_2]......[ exp_dim_n]
(*nume)(lista_tipuri_parametri)
**nume
(*nume)[exp_dim_1]
(*nume)[exp_dim_1][ exp_dim_2]......[ exp_dim_n]

nume – identificator care preprezintă numele variabilei pointer definită sau declarată.
int a = 10, *p;
p = &a;
printf(“%d”, *p);
a = 20;
printf(“, %d”, *p);
*p = 30;
printf(“, %d”, *p);

Pointeri și tablouri unidimensionale


Elementele unui tablou pot fi accesate cu ajutorul operatorului de indexare [] ,
sau cu ajutorul operatorui de adresare indirect *. Accesarea unui element i al tabloului a se
pot folosii următoarele expresii:
a[i]
*(a+i)

Dacă un pointer p indică elementele unui tablou, atunci p+1 va indica elementul următor.

Operații artimetice cu pointeri

Operațiile aritmetice premise sunt următoarele: aduagarea sau scăderea unei


valori întregi și scăderea unui alt pointer de același tip.

Adunarea unei valori întregi la un pointer:

for(i=0;i<n; i++){
printf("%d\n", *(tab+i));
}

Scăderea unei valori întregi la un pointer:

int tab[] = {1, 2, 3, 4, 5, 6, 7, 8};


int n=8, i;
int *ptr = &tab[7];
for(i=0;i<n; i++){
printf("%d\n", *ptr--);
}
Scăderea a doi pointer de același tip

p1 = &a[i]
p2 = &a[j]

Valoare expresiei p1-p2 este echivalentă cu i-j

Pointeri și tablourile multidimensionale

Un tabloul cu n dimensiuni poate fi privit ca un tablou unidimensional ale cărui


elemente sunt tablouri cu n-1 dimensiuni.

tip_de_bază nume[][exm_dim_2]…..[exp_dim_n]
tip_de_bază (*nume)[exm_dim_2]…..[exp_dim_n]

Accesarea elementelor se face folosind următoarea expresie:


nume[ind_1][ind_2][ind_3]…..[ind_n]
(*(nume+ind_1)) [ind_2][ind_3]…..[ind_n]
(*(*(nume+ind_1)+ind_2))[ind_3]…..[ind_n]
(*(*(*(nume+ind_1)+ind_2)+ind_3))…..[ind_n]
(*…. (*(nume+ind_1)+ind_2)+ind_3)…..) +ind_n)

Exemple de afișare a unui elemente intr-o matrice tridimensionala:


printf("%2d, ", pt[i][j][k]);
printf("%2d, ", (*(pt+i))[j][k]);
printf("%2d, ", (*(*(pt+i)+j))[k]);
printf("%2d, ", (*(*(*(pt+i)+j)+k)));
Probleme:
1. Definiti urmatoarele functii
void afiseaza_prin_indici(char *sir)
void afiseaza_prin_pointer(char *s)

2. definiti urmatoarele functii


int maxim(int *ptr1, int *ptr2)
void fct(float a,float b, float &medie)
void inc(int * p_n)

3. Se dau doua siruri de caractere X si Y. Sa se afiseze toate literele comune celor doua
siruri utilizandu-se tehnica pointerilor.

4. Funcție pentru incrementarea unui moment de timp, dat ca oră, minut și secunda și
perioada zilei (AM sau PM). Funcția va trebui să modifice 3 numere întregi și un
vector de caractere și va primi 3 argumente pointer și un argument vector.
09 09 09 AM -> 09:09:10 AM
10 29 59 PM -> 10:30:00 PM
11 59 59 PM -> 00:00:00 AM

5. Un program care va căuta și înlocui un șir dat cu alt șir (de lungime diferită) într-un
text. Vor fi înlocuite toate aparițiile șirului dat.

Textul se va introduce în program ca un șir constant. Șirul căutat și cel cu care va fi


înlocuit se citesc de la consolă.

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