Se intampla de multe sa stii intr-un program care este acel loc in care se stocheaza o variabila. Poate ca nu este cu adevarat nevoie la un examen sa stii asta, dar poate cauti in profunzime sa intelegi ce se intampla cand dai de o problema. In cele ce urmeaza iti explic valoarea unui pointer.
Pana acum stiam ca o variabila este definita prin doua caracteristici: denumire si valoare. Acum vom invata faptul ca defapt sunt 3 caracteristici: denumire, valoare si adresa din memorie.
Ce este un pointer?
Memoria interna a calculatorului este organizata sub forma unei matrici imense, in care fiecare patratica reprezinta un loc in care pot fi stocate diferite informatii. Fiecare patrat este numerotat consecutiv in baza 16 incepand de la 0. Aceste numere se numesc adrese de memorie.
Pointerii pot sa pastreze adrese de memorie ale altor variabile (care la randul lor sa contina alte valori). Un pointer este asociat intotdeauna unui tip de variabila (int, char, bool, s.a.m.d.). Pointerul indica defapt o zona din memoria calculatorului.
Declararea variabilelor de tip pointer
Pointerii se declara in felul urmator:
tipData *denumire;
De exemplu pentru a declara un pointer pentru o variabila int, vom scrie: int *p;
Aveti grija in schimb, daca scriem int *p1, p2; Doar p1 va fi de tip pointer, p2 va fi de tipul int, exact cum am invatat pana acum.
Operatorul & (de adresare / referinta)
Se aplica unei variabile si afiseaza adresa de memorie a variabilei (sau a vectorului, cum vom vedea putin mai in-colo). Luam urmatorul exemplu:
#include <iostream> using namespace std; int main() { int a = 17; int *p = &a; cout << a << " " << p << "\n"; // Afiseaza 17 si adresa lui a din memorie return 0; }
Se va afisa 17 si adresa din memoria a lui a.
Operatorul * (de dereferentiere)
Acest operator se aplica unei variabile de tip pointer, iar daca am scrie urmatoarea linie in programul de mai sus, am obtine valoarea care este stocata in a.
cout << a << " " << *p; // Afiseaza 17 si valoarea adresei din memorie a lui a
Pointeri si vectori
Denumirea unui vector este de fapt un pointer catre primul sau element. Daca rulam urmatorul cod putem observa urmatoarele:
#include <iostream> using namespace std; int main() { int v[4] = {7, 1, 2, 6}; cout << *v; // Afiseaza 7 cout << v; // Afiseaza adresa catre 7 return 0; }
La declararea unui vector de 4 elemente, acestuia ii se atribuie exact 4 patratele in memorie unul langa altul. Pentru a intelege mai bine acest concept, haideti sa vedem ce se intampla linie cu linie daca rulam urmatorul cod:
#include <iostream> using namespace std; int main() { int v[5]; int *p; p = v; *p = 13; p++; *p = 2; p = &v[2]; *p = 7; p = v + 3; *p = 22; p = v; *(p + 4) = 55; for(int i = 0; i < 5; i++) cout << v[i] << " "; return 0; }
- p = v; pune pointerul catre inceputul vectorului
- *p = 13; va pune pe prima pozitia a vectorului elementul 13;
- p++; muta pozitia lui p catre urmatorul element (elementul 1)
- *p = 2; va pune numarul 2 pe pozitia 1 din vector
- p = &v[2]; memoreaza in p adresa elementului nr 2
- *p = 7; va pune numarul 7 pe a doua pozitie
- p = v + 3; va muta pointerul p la al 3-lea element;
- *p = 22; va pune 22 pe a 3-a pozitia
- p = v; muta inapoi pointerul p catre inceputul vectorului
- *(p + 4) = 55; va pune numarul 55 pe ultima pozitie din vector
Exercitii rezolvate (in videoclip)
1. Cum o sa arate v dupa ce se executa chestia de mai jos:
int v[4] = {5, 2, 89, 1}; int *p = v; p++; p++; *p = 13; p = &v[0]; p = v + 2; *p = 89; p = v-1; *p = 22;
2. Care va fi valoarea lui a si valoarea lui b dupa executarea urmatoarelor instructiuni:
int a = 10, b = 13; int *p1, *p2; p1 = &a; p2 = &a; *p1 = 4; *p2 = 5; p1 = p2; p1 = &b; *p1 = 20; *p2 = 21;
3. Care va fi valoarea lui a si valoarea lui b dupa executarea urmatoarelor instructiuni:
int a = 10, b = 13; int *p1 = &a, *p2 = &b; *p1 = *p2 + 10; p1 = p2; *p2 = *p1 + 10;