CATEGORII DOCUMENTE |
POINTERI SI TABLOURI
In limbajele C/C++ exista o stransa legatura intre pointeri si tablouri, deoarece numele unui
tablou este un pointer (constant!) si are ca intotdeauna, ca
valoare, adresa primului element
din tablou. Diferenta dintre pointerul - nume al unui tablou si o variabila pointer "obisnuita este aceea ca unei variabile de tip pointer i se pot atribui
valori la executie, lucru imposibil
pentru numele unui tablou (acesta are tot
timpul, ca valoare, adresa primului sau element). De
aceea, se spune ca numele unui tablou este un pointer constant (valoarea lui
nu poate fi
schimbata Numele unui tablou este considerat ca fiind un rvalue (right value-valoare
dreapta), deci nu poate apare decat in partea dreapta a unei expresii de atribuire. Numele unui pointer (in exemplul urmator, ptr) este considerat ca fiind un lvalue (left value-valoare stanga), deci poate fi folosit atat pentru a obtine valoarea obiectului, cat si pentru a o modifica printr-o operatie de atribuire.
Exemplul 5.9.:
int a[10], * ptr; // a este &a[0], deci a este pointer constant
a = a + 1; // ilegal
ptr = a ; // legal: ptr are aceeasi valoare ca si a, respectiv adresa elementului a[0]
ptr este variabila pointer a este constanta pointer
int x = a[0]; // echivalent cu x = ptr; se atribuie lui x valoarea lui a[0]
Deoarece numele tabloului a este sinonim pentru adresa elementului de indice zero din tablou, atribuirea ptr=&a[0 poate fi inlocuita, ca in exemplul anterior, cu ptr=a
1. POINTERI SI TABLOURI UNIDIMENSIONALE
Deoarece numele unui tablou este un pointer
(constant), putem concluziona (figura 5.2):
a+i Û & a[i]
a[i] Û * (a+i)
a[0] a[1] a[9]
a
a=&a[0] a+1=&a[1] a+9=&a[9]
a=a[0] * (a+1)=a[1] (a+9)=a[9]
ptr Figura 5.2. Legatura dintre pointeri si tablouri
Operatia de indexare a elementelor unui tablou poate fi realizata cu ajutorul variabilelor
pointer.
Exemplul 5.10.:
int a[10], * ptr; // a este pointer constant; ptr este variabila pointer
ptr = a; // ptr este adresa lui a[0]
ptr+i inseamna ptr+(i sizeof(int)), deci: ptr + i Û & a[i]
Exercitiul 5.2.: Sa se scrie urmatorul program - care ilustreaza legatura dintre pointeri si vectori - si sa se urmareasca rezultatele executiei acestuia.
#include <iostream.h>
#include <conio.h>
int main(void)
; int pi1 = a ;
int pi2 = &a[0]; int pi3;
cout<<"a="<<a<<"&a="<<&a<<" a="<< a<<'n';
cout<<"a+1="<<(a+1)<< " &a[1]="<< &a[1]<<'n';
cout<<"a[1]="<<a[1]<< " * (a+1)="<< * (a+1)<<'n';
cout<<"pi1="<<pi1<<"pi2="<<pi2<<'n'; int x= pi1;
x primeste valoarea locatiei a carei adresa se afla in variabila pointer pi1, deci valoarea lui a[0] */
cout<<"x="<<x<<'n'; x= pi1++; // echivalent cu (pi1++) x=1
cout<<"x="<<x<<'n'; x=( pi1)++;
/* x=0: intai atribuirea, apoi incrementarea valorii spre care pointeaza pi1. In urma incrementarii, valoarea lui a[0] devine 1 */
cout<<"x="<<x<<'n'; cout<< pi1<<'n';x= ++pi1; //echivalent cu (++pi1)
cout<<"x="<<x<<'n'; x=++( pi1); cout<<"x="<<x<<'n'; pi1=a; pi3=pi1+3;
cout<<"pi1="<<pi1<<" pi1="<<
pi1<<"&pi1="<<&pi1<<'n';
cout<<"pi3="<<pi3<<" pi3="<<
pi3<<"&pi3="<<&pi3<<'n';
cout<<"pi3-pi1="<<(pi3-pi1)<<'n'; //pi3-pi1=3
int *pt1,*pt2,*pt3; int v1[2]=; int v2[2]=; pt1 = pt2 = v1; pt3 = v2;
cout<<'Op.*si ++ au aceeasi priorit, asociat.de la dr.la stn'; cout<<'*pt1 pointeaza spre val'<<*pt1<<' de la adr'<<pt1<<'n'; cout<<'*pt2 pointeaza spre val'<<*pt2<<' de la adr'<<pt2<<'n'; cout<<'&v1[0]='<<&v1[0]<<'v1='<<v1<<'Val v1[0]='<< v1[0]<<'n'; cout<<'*++pt1 pointeaza catre val'<<*++pt1;
cout<<' de la
adr incrementata '<<pt1+1<<'n';
cout<<'Noua valoare a lui pt1='<<pt1<<'n';
cout<<'*pt3 pointeaza spre val'<<*pt3<<' de la adr'<<pt3<<'n';
cout<<'(*pt3)++ pointeaza catre valoarea '<<(*pt3)++<<'n'; cout<<'pt3='<<pt3<<' *pt3='<<*pt3<<' v2[0]='<<v2[0]<<'n'; getch(); textmode(3); return 0; }
Exercitiul : Sa se scrie un program care citeste elementele unui vector de intregi, cu maxim 20 elemente si inlocuieste elementul maxim din vector cu o valoare introdusa de la tastatura. Se va folosi aritmetica pointerilor.
#include <iostream.h>
void main()
// citirea elementelor vectorului max= a; indice=0;
for (i=0; i<n; i++)
if (max<= (a+i))
// aflarea valorii elementului maxim din vector si a pozitiei acestuia int val;
cout<<"Valoare de inlocuire:"; cin >> val; // citirea valorii de inlocuire
(a+indice)=val; //inlocuirea propriu-zisa
for (i=0; i<n; i++)
cout<< (a+i);<<'t';
cout<<'n';
// afisarea noului vector
/* in acest mod de implementare, in situatia in care in vector exista mai multe elemente a caror valoare este egala cu valoarea elementului maxim, va fi inlocuit doar ultimul dintre acestea (cel de indice maxim).*/
POINTERI SI SIRURI DE CARACTERE
Asa cum
s-a aratat in capitolul 4, un sir de caractere este un caz particular al unui
vector de
caractere. Spre deosebire de celelalte constante, constantele sir de
caractere nu au o lungime
fixa, deci numarul de octeti alocati la compilare pentru
memorarea sirului, variaza. Deoarece
valoarea variabilelor pointer poate fi schimbata in
orice moment, cu multa usurinta, este
preferabila utilizarea acestora, in locul tablourilor de caractere
(vezi exemplul urmator).
Exemplul 5.11.:
char sir[10]; char * psir;
sir = "hello"; // ilegal
psir = "hello"; // legal
Exercitiul 5.4.: Sa se scrie urmatorul program - care ilustreaza legatura dintre pointeri si sirurile de caractere - si sa se urmareasca rezultatele executiei acestuia.
#include <iostream.h>
void main(void)
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 1703
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved