11.07.2015 Views

LUCRAREA NR. 6 POINTERI

LUCRAREA NR. 6 POINTERI

LUCRAREA NR. 6 POINTERI

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

# include void main (void) {int x;int *p1,*p2; /* pointeri la intregi */p1 = &x; /* p1 indica spre x */p2 = p1 /* p2 indica tot spre x */printf ("p1 = %p p2 = %p", p1, p2); }/* Se afiseaza valoarea hexa a adresei lui x, nu valoarea lui x */Se observă că în funcţia printf() tipărirea se face cu formatul %p care specifică faptul că variabileledin listă vor fi afişate ca adrese pointer.• Operaţii aritmetice efectuate asupra pointeriloro Utilizarea operatorilor de incrementare şi decrementareFie secvenţa:int *p1; /* pointer la intreg */p1++;De fiecare dată când se incrementează p1, acesta va indica spre următorul întreg. Astfel, dacă p1 = 2000,după efectuarea instrucţiunii p1++, acesta va fi p1 = 2004 (va indica spre următorul întreg).‣ După fiecare incrementare a unui pointer, acesta va indica spre următorul element al tipului său debază.‣ După fiecare decrementare a unui pointer, acesta va indica spre elementul anterior.Valoarea pointerilor va fi crescută sau micşorată în concordanţă cu lungimea tipului datelor spre careaceştia indică, aşa cum se poate vedea în exemplul următor:Cum valoarea indirectată de un pointer este o l-valoare, ea poate fi asignată şi incrementată ca oricealtă variabilă. O l-valoare (left value) este un operand care poate fi plasat în stânga unei operaţii deatribuire. Verificaţi utilizarea pointerilor din programul următor:# include void main(void) {short *pi, *pj, t;long *pl; double *pd;short i, j;i=1; j=2; t=3;printf("i= %d, j= %d\n", i, j);pi=&i; pj=&j;printf("pi= %p, pj= %p\n", pi, pj);*pj /= *pi+1;printf("*pi= %d *pj= %d\n", *pi, *pj);*pj /= *pi+2;printf("*pi= %d *pj= %d\n", *pi, *pj);printf("++pj= %p, ++*pj= %d\n",++pj,++*pj); }o Utilizarea operatorilor de adunare şi de scădereLa sau dintr-un pointer, se pot aduna sau scădea valori de tip întreg. Rezultatul este un pointer deacelaşi tip cu cel iniţial, indicând spre un alt element din tablou. De exemplu,p1 = p1 + 9;face ca p1 să indice spre al 9-lea element având tipul lui p1, considerând că elementul curent este indicatde p1. Evident că valoarea pointerului se va modifica corespunzător lungimii tipului datei indicată prinpointer.Exemplu:int *p1; /* Pointer la intreg */p1 = p1 + 9;Dacă valoarea p1 = 3000, atunci p1 + 9 va avea valoarea:(valoarea lui p1)+9*sizeof(int)=3000+9*4=3036Aceleaşi considerente sunt valabile în cazul în care un întreg este scăzut dintr-un pointer. Dacă doipointeri de acelaşi tip sunt scăzuţi, rezultatul este un număr întreg cu semn care reprezintă deplasamentuldintre cei doi pointeri (pointerii la obiecte vecine diferă cu 1).În cazul tablourilor, dacă pointerul rezultat indică în afara tabloului, rezultatul este nedefinit.Dacă p indică spre ultimul membru dintr-un tablou, atunci (p+1) are valoare nedeterminată.Observaţii :• Nu se pot aduna sau scădea valori de tip float sau double la/sau dintr-un pointer.2

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!