...us valorile variabilelor intregi x si y, am definit un pointer la variabila x si am atribuit acestuia adresa de memorie alocat variabilei x. Sa analizam atent liniacoutx are valoarea pxPrin px se intelege valoarea aflata in zona de memorie a carei adresa este memorata in pointerul px. Valoarea afisata va fi chiar valoarea introdusa pentru x deoarece, inainte de afisare, pointerul px a primit ca valoare adresa variabilei x, adresa la care se afla valoarea acesteia valoare dobandita prin utilizarea functiei cin.Atribuirea pxy va modifica valolarea care se afla la adresa memorata de px, valoare care va fi valoarea introdusa de utilizator pentru variabila y. Astfel va fi modificata chiar valoarea pe care o are variabila x.Fireste ca era mai simplu sa folosim atribuirea xy care are acelasi efect si ne scuteste de de-a mai folosi pointeri, insa exemplul este pur didactic.Operatorul unar este folosit sub forma variabilaspointer, valoarea acestei expresii fiind valoarea care se gaseste in memorie la adresa memorata de pointerul ce apare ca operand. In concluzie, prin px avem acces la adresa variabilei x, iar prin px la valoarea variabilei x.Vom spune ca un pointer refera indirect un obiect sau ca pointeazaarata la obiectul respectiv. Variabilele pointer pot fi incadrate ca fiind de tip referinta.Exemplul 2. Sa se calculeze suma a doua numere reale folosind pointeri.include iostream.hvoid mainIdouble x,y,zdouble px, py, pzcinxcinypxxpyypzzpzpxpycoutSuma este pzS 2. Pointeri si tablouriIn limbajul C, exista o foarte stransa legatura intre pointeri si tablouri, astfel ca pointerii si tablourile sunt tratate la fel. Orice program in care apar tablouri poate fi modificat astfel incat sa foloseasca poiteri in locul tablourilor. In aceasta sectiune vom discuta despre legatura dintre pointeri si vectori tablouri unidimensionale.Fie urmatoarele declaratiiint ai20sint paAm declarat o variabila a , care este un vector cu maxim 20 elemente intregi si un pointer la o variabila de tip intreg. Dupa cum se stie, o valoare int are nevoie de 16 biti pentru a fi memorata, adica 2 bytes o variabila int poate retine numere intregi intre -32768 si 32767, vezi curs Bazele Informaticii. Pentru tabloul a vor fi alocati 2 2040 bytes consecutivi in memorie adica, pentru primul element ai0s sunt alocati primii 2 bytes, pentru ai1s urmatorii 2 bytes,, pentru ai19s ultimii 2 bytes din cei 40 alocati.Fie atribuireapaai0sDupa aceasta atribuire, pointerul pa contine adresa primului element al vectorului, adica pa pointeaza la inceputul vectorului a.Daca scriem paai3s atunci pa va referi elementul al 4-lea din vectorul a, iar pa va contine valoarea sa.Operatiile care se pot realiza cu pointeri suntcomparatia adunarea unui pointer cu un intreg scaderea unui intreg dintr-un pointer Doi pointeri pot fi comparati folosind operatori relationali. In comparatiaifp1p2 coutAdrese identiceelse coutAdrese diferitese verifica daca adresa memorata de p1 este aceeasi cu adresa retinuta de p2, unde p1 si p2 sunt pointeri de acelasi tip.Se poate compara un pointer cu valoarea NULL sau 0. Un pointer are valoarea NULL valoare nedefinita daca nu refera nici un obiect.Adunarea unui pointer cu un intreg este definita numai atunci cand pointerul refera un tablou un element al tabloului. Scaderea este definita in acelasi caz.Exemplul 3. Sa se citeasca elementele unui vector si sa se afiseze acestea utilizand pointeri.include iostream.hvoid mainIint ai20sint paint i,ncoutNumarul de elemente cinnfori0iniIcoutElementulicinaiisSafisarea vectorului folosind pointeripaai0sfori0iniIcoutpatnpaSS Prima pate a programului nu contine elemente noi, doar a doua parte meritand atentie. Mai intai initializam pointerul pa cu valoarea primului element al vectorului a. Ciclul for contine urmatoarele prelucrariafiseaza valoarea aflata la adresa indicata de pointer aduna pointerul pa cu 1 Incrementarea pointerului pa are ca efect modificarea adresei memorate in pa. Noua adresa este adresa zonei de memorie corespunzatoare elementului urmator, o adresa cu 2 bytes mai mare decat precedenta. Observam ca marirea pointerului cu o unitate inseamna de fapt trecerea la urmatorul element din vector.Daca vom introduce pentru n o valoare mai mare decat 20 numarul maxim de elemente ale vectorului, asa cum reiese din declaratie atunci pointerul pa va depasi zona de memorie alocata vectorului si va referi o adresa la care se pot afla date importante pentru program. Urmarile pot fi imprevizibile, de la blocarea programului pana la blocarea sau inchiderea calculatorului !!! doiGsgy -2002- 129EFMNTUrsyzLMeTUaabcpqOZ OJQJ0J0Ja5a65CJOJaQJa5
Z aktdtIt2aaFaaaaFaiaiaaFNUszRUacqaaaaaaaaOkvlO...
Download