OPERAŢII CU POINTERI

 

      Asupra pointerilor se pot face diferite operaţii. Deoarece ei conţin adrese atunci operaţiile se realizează cu adrese.

 

Incrementare şi decrementare 

      Operatorii de incrementare şi decrementare se pot aplica variabilelor de tip pointer.

Efectul:

operatorul de incrementare aplicat asupra unui operand de tip pointer spre tipul tip măreşte adresa conţinută de operand cu numărul de octeţi necesari pentru a păstra o dată de tipul tip.

operatorul de decrementare se execută în mod analog, cu singura diferenţă că în loc să se mărească adresa, ea se micşorează cu numărul corespunzător de octeţi.

De obicei decrementările şi incrementările adreselor sunt mai rapide ca execuţie când se au în vedere prelucrări de tablouri.

Exemplu:

            int tab[10];

            int *p;

            int i=0;

            p=&tab[i];

            p++;        // p contine adresa lui tab[1]

                       // cu p se pot face referiri la orice element de tablou

 

Adunarea şi scăderea unui întreg dintr-un pointer 

      Dacă p este un pointer, sunt corecte expresiile de forma:

p+n şi p-n

unde n este de tip întreg. 

Efectul:

expresia p+n măreşte valoarea lui p cu n*nr_tip, unde nr_tip este numărul de octeţi necesari pentru a memora o dată de tipul tip spre care pointează p;

analog expresia p-n micşorează valoarea lui p cu n*nr_tip. 

Dacă x este un tablou de tipul tip, atunci x este pointer, deci o expresie de forma:

x+n; 

este corectă şi deoarece x este un pointer spre primul său element x[0], x+n va fi un pointer spre elementul x[n]. Rezultă că valoarea elementului x[n] se poate reprezenta prin expresia:

*(x+n); 

      Astfel variabilele cu indici se pot înlocui prin expresii cu pointeri. Aceasta permite ca la tratarea tablourilor să se folosească expresii cu pointeri în locul variabilelor cu indici. Versiunile cu pointeri sunt de obicei optime în raport cu cele realizate prin intermediul indicilor.

 

Compararea a doi pointeri 

      Doi pointeri care pointează spre elementele aceluiaşi tablou pot fi comparaţi folosind operatorii de relaţie şi de egalitate. Astfel, dacă p şi q sunt doi pointeri care pointează spre elementele tab[i], respectiv tab[j] ale tabloului tab, expresiile următoare au sens:

p<q   p!=j  p= =q. 

Observaţii:

1o. Pointerii nu pot fi comparaţi decât în condiţiile amintite mai sus (deci dacă sunt pointeri spre elementele aceluiaşi tablou).

2o. Operatorii = = şi != permit compararea unui pointer şi cu o constantă simbolică specială având numele NULL. Aceste comparaţii permit să stabilim dacă un pointer conţine o adresă sau nu. Astfel, dacă expresia:

p= = NULL 

este adevărată, p nu conţine o adresă. Dacă expresia respectivă are valoarea fals atunci p conţine o adresă. Constanta simbolică NULL este definită în fişierul stdio.h

 

Diferenţa a doi pointeri 

Doi pointeri care pointează spre elementele aceluiaşi tablou pot fi scăzuţi. Rezultatul diferenţei a doi pointeri este definit astfel: fie t un tablou de un tip oarecare şi p şi q doi pointeri, p conţine adresa elementului t[i] iar q conţine adresa elementului t[i+n]. Atunci diferenţa q-p are valoarea n.

Exemple 

      Vom da câteva funcţii asupra şirurilor de caractere:

funcţia lungime 

            unsigned lungime (char*x)

                       { int i;

                        for (i=0; *x != ‘\0’; i++) x++;                 // sau for (i=0; *x++; i++);

                        return i;

                       }

 funcţia copiază 

            void copiaza(char *x, char *y)               // copiaza din zona de adresa y

                                                                                  // in zona de adresa x

                       { while(*x++ = = *y++); }

funcţia concateneaza 

            void concateneaza (char *x, char *y)

// concateneaza sirul de adresa y la sfarsitul sirului

// de adresa x

                       { while (*x) x++;            // avans de adresa pana la sfarsitul sirului x

                        while (*x++= *y++);

}

 funcţia compara 

                       int compara (char *x, char *y)

                       { while (*x= = *y)

                                   { if (*x= = ‘\0’)   return 0;

                                    x++;

                                    y++;

                        return *x - *y;               // daca diferenta caracterelor este

// negativa atunci x<y altfel x>y

}

}