11.07.2015 Views

LUCRAREA NR. 6 POINTERI

LUCRAREA NR. 6 POINTERI

LUCRAREA NR. 6 POINTERI

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

• Nu se pot efectua operaţii de înmulţire şi împărţire cu pointeri.Exemplu: Scăderea a doi pointeri este exemplificată în programul:# include void main(){int i=4, j;float x[] = {1,2,3,4,5,6,7,8,9}, *px;j = &x[i]-&x[i-2];px = &x[4]+i;printf("%d %f %p %p\n",j,*px,&x[4],px); }o Compararea pointerilorDoi pointeri de acelaşi tip se pot compara printr-o expresie relaţională, astfel: dacă p şi q sunt doipointeri, atunci instrucţiunile:if (p < q)printf (“ p indica spre o adresa mai mica decit q \n “);sunt corecte.Compararea pointerilor se utilizează când doi sau mai mulţi pointeri indică spre acelaşi obiectcomun.Exemplu: Un exemplu interesant de utilizare a pointerilor constă în examinarea conţinutului locaţiilor dememorie ale calculatorului./*Programul afiseaza continutul locatiilor de memorie dela o adresa specificata*/# include # include dump (start);void main (void) {unsigned long int start; /* start = adresa de inceput */printf (“Introduceti adresa de start: “);scanf (“ %lu “, &start);dump (start); } /* Se apeleaza functia dump () */dump (start) /* Se defineste functia dump() */unsigned long int start;{ char far *p;int t;p = (char far *) start; /*Conversie la un pointer*/for (t = 0; ; t++, p++) {if (!(t%16)) printf ("/n");printf ("%2X ", *p); /*Afiseaza in hexazecimal continutul locatieide memorie adresata cu *p*/if (kbhit()) return;} } /* Stop cand se apasa orice tasta */o Utilizarea pointerilor ca parametri formali ai funcţiilorÎn exemplele de până acum, s-au folosit funcţii C care atunci când erau apelate, parametrii acestorfuncţii erau (întotdeauna) actualizaţi prin pasarea valorii fiecărui argument. Acest fapt ne îndreptăţeşte sănumim C-ul ca un limbaj de apel prin valoare. Există totuşi o excepţie de la această regulă atunci cândargumentul este un tablou. Această excepţie este explicată, pe scurt, prin faptul că valoarea unui nume alunui tablou (vector, matrice etc.) neindexate este adresa primului său element.Folosind variabile pointer se pot pasa adrese pentru orice tip de date. Spre exemplu, funcţia scanf()acceptă un parametru de tip pointer (adresă): scanf(“%f“,&x);Ceea ce este important de evidenţiat este cum anume se poate scrie o funcţie care să accepte caparametri formali sau ca argumente pointeri ?.Funcţia care recepţionează o adresă ca argument va trebui să declare acest parametru ca ovariabilă pointer. De exemplu, funcţia swap() care va interschimba valorile a doi întregi poate fi declaratăastfel:# include void swap(); /*Prototipul functiei swap()*/void main(void){ int i,j; i=1; j=2;printf("i= %d j= %d\n", i, j);swap(&i,&j); /* Apelul functiei */printf("i= %d j= %d\n", i, j); }void swap(int *pi, int *pj){ int t;t = *pi; *pi = *pj; *pj = t; }3

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

Saved successfully!

Ooh no, something went wrong!