Pointeri C++
Anul asta, anul III IM URA, ne vom lupta inca o data cu pointeri in frunte cu Dna Conf. Universitar Stanica Lavinia. Dupa discutie pe care am avut-o cu Dl Pop despre pointeri si pentru ca am discutat si cu Bogdan ca un post care sa explice mai bine pointerii ar fi bine venit.
Pointerii, dupa cum s-a discutat la seminar, sunt foarte foarte puternici. Dar pe cat de puternici sunt pe atat de grei sunt de folosit. Si eu i-am prins greu si nu le intelegeam rostul pana destul de tarziu.
Daca nu stii ce e ala un pointer gandeste-te asa:
- Ai un fisier FolderOne in C:/ (variabila A), dupa creezi un folder in D:/ denumit FolderTwo (variabila B). Copiezi toate fisierele din FolderOne in FolderTwo. Daca tu modifici vreun fisier in FolderOne, continutul lui FolderTwo va ramane neschimbat.
- Ai un fisier FolderOne in C:/ (variabila A), dupa creezi un folder in D:/ denumit FolderThree (variabila C). Faci shortcut de la fisierele din FolderOne in FolderThree. Practic acum, in FolderThree tu nu ai fiserele din FolderOne, ai doar niste shortcut-uri care arata (they point) la fisierele din FolderOne. Orice modificare o faci la fisere in FolderOne se va vedea in FolderTwo.
Unde se afla FolderOne (&)
FolderOne=paint.exe; //Aloc un spatiu oarecare in calculator pentru FolderOne
FolderTwo=FolderOne; //Copiez in FolderTwo informatiile din FolderOne
D=&FolderOne; //A aparut o variabila D care stie unde am pus eu FolderOne, adica variabila mea D va avea valoarea de C:/ pentru ca acolo l-am creat pe FolderOne
Ce se afla in FolderOne(*)
FolderOne=paint.exe; // Aloc un spatiu oarecare in calculator pentru FolderOne
FolderThree=*FolderOne; //Aici devine dubioasa treaba, in momentul acesta ganditi-va ca pur si simplu am creat un shortcut pentru paint.exe in FolderThree ci nu am mai copiat acea valoare (am economisit spatiu)
Cum sa arati cu degetul (to point)
Am invatat cum sa ne referim la adresa unde se afla FolderOne (prin & care imi va arata C:/) si cum ma refer la ce se afla in FolderOne (prin * care imi va arata paint.exe)
Dar cum creez un pointer? Simplu:
string *FolderOne;
Eu arat, tu arati, toata lumea arata cu degetul (aratatorul)
string folderOne= paint.jpg; // Aloc un spatiu oarecare in calculator pentru folderOne;
string *folderTwo; // Creez un pointer
folderTwo=&folderOne; //Am creat shortcut-ul la paint.jpg in FolderTwo
*folderTwo=paint.jpg; // Am modificat ceva in paint.jpg (am adaug un punct negru imaginii de exemplu)
Ce se intampla daca intru in folderOne si deschid pain.jpg? Pai vad poza modificata de mine, acelasi lucru daca intru in folderTwo, pentru ca este un shortcut si nu este o copie a acelei fotografii.
Exemplu practic
int a=5, b = 10;
int p1*, p2*;
p1 = &a;
p2=&b;
*p1=10;
p1=p2;
*p1 = 20;
Ce va afisa variabila a si ce va afisa variabila b?
Raspuns: a=10, b=20;
Motivul detaliat pe linii de cod:
1) am initializat cele doua variabile a si b
2) am creat cei doi pointer
3) p1 memoreaza adresa lui a;
4) p2 memoreaza adresa lui b;
5) schimb ce se afla la adresa stocata in p1 (adica adresa lui a) cu valoarea 10;
6) p1 ia valoarea adresei pe care p2 o luase de la b;
7) la adresa la care arata acum p1 pun valoarea 20;
Capra vecinului!
Sa zicem ca avem un array:
int a[]= {1,2,3,4};
int *p1; p1=&a[1];
Ce va afisa *p1 acum?
Dar dupa ce scriu p1++;
Pai p1=&a[1] va lua adresa la care se afla a doua valoare al array-ului a, adica valoarea 2 (intr-un array numaratoarea incepe de la 0, nu de la 1). Dupa ce am scris p1++ trec la urmatoarea valoare din array adica 3. La fel cuntioneaza si p1–;
Pointercepton
Daca nu v-am ametit suficient mai vin cu o chestie, pointeri de pointeri. Chestia asta deja m-a ametit si pe mine, it’s hard si nu va cere la facultate, dar it’s nice to know. Mai ales pentru cei care chiar vor sa invete C++.
int **adrian;
int *alexandru;
int coman=5;
alexandru=&coman;
adrian=&alexandru;
Ce va afisa: adrian, &alexandru, *adrian, &coman, **adrian
Feedback
Ati prins faza cu shortcut-urile? Ati inteles cum sa aratati cu degetul (aratatorul)? Ati inteles care este logica intrebarii? Daca nu, atunci lasati aici o intrebare sau ma gasiti pe facebook si mereu raspund cu placere.
Da, lasa ca am declarat un string ca pointer, e de dragul exercitiului. In C++ un string il declari ca fiind un sir de caractere, but meh prea multe intr-un singur post.
By: Adrian Coman
La ce folosesc chestiile astea?
Dacă lucrez în domeniul software development, la nimic. Dacă vrei să lucrezi în domeniu, la multe 🙂