next up previous contents
Next: Pointeri ca argumente ale Up: Pointeri Previous: Introducere   Cuprins


Operatii cu pointeri

Pointerii se declara punând un asterisc (*) în fata numelui variabilei:

int variabila;    /*definire variabila intreg*/
int *variabila_ptr; /*definire pointer la un intreg */

Operatorii specifici pointerilor sunt: operatorul de dereferentiere * (pentru un pointer, returneaza entitatea referita de pointer) si operatorul de adresa & (pentru o entitate, returneaza adresa entitatii). Exemplul urmator explica folosirea acestor operatori. Variabila pointer obiect_ptr primeste adresa variabilei obiect, astfel obiect_ptr va indica spre zona de memorie unde este memorata variabila obiect. În ultima linie, se stocheaza valoarea 5 la zona de memorie spre care arata obiect_ptr, adica în variabila obiect.

int obiect; /* variabila de tip intreg */
int * obiect_ptr; /* pointer la un intreg */

obiect=4;
obiect_ptr=&obiect; /* obiect_ptr va indica
                       spre obiect */
printf("%d\n", *obiect_ptr); /* afiseaza valoarea
                                  spre care indica
                                  obiect_ptr */
*obiect_ptr=5; /* atribuie lui obiect
                  valoarea 5 */

Folosirea gresita a operatorilor poate duce la functionari incorecte a programului sau, în cazul fericit, la erori semnalate de compilator:

*variabila
este ilegal, prin aceasta se solicita entitatea referita de o variabila care nu este un pointer;
&variabila_ptr
este legal, dar "neobisnuit", se solicita adresa lui variabila_ptr, adica un pointer la un pointer.

Mai multi pointeri pot indica spre aceeasi zona de memorie:

int obiect;
int *obiect_ptr1;
int *obiect_ptr2;

obiect = 1; /* se atribuie valoarea 1 lui obiect */

obiect_ptr1 = &obiect;
obiect_ptr2 = obiect_ptr1;
/* obiect_ptr1 si obiect_ptr2 vor indica spre 
   aceasi locatie de memorie */
printf("%d %d\n", *obiect_ptr1, *obiect_ptr2);

Un pointer special definit în limbajul C este pointerul NULL, care nu indica spre nimic (adresa spre care arata acest pointer este 0). Acest pointer este definit în stdio.h si în stdlib.h ca fiind (void *) 0, adica un pointer spre o locatie de tip void si care arata spre locatia de memorie 0.

O situatie în care pointerii sunt utili este declararea structurilor recursive. În C nu se permite ca o structura sa contina câmpuri de tipul aceleiasi structuri. Aceasta restrictie poate fi evitata folosind pointeri la structuri, dupa cum se arata în exemplul urmator:

typedef struct pers
{
  char nume[20];
  int varsta;
  struct pers * urmator;
} persoana;

persoana *p;

Pentru a referi un câmp folosind un pointer spre o structura, se foloseste operatorul de dereferentiere: (*p).nume. Echivalent cu acest operator exista în C un alt operator pentru accesarea câmpurilor din structurile indicate de pointeri: p-$>$nume.


next up previous contents
Next: Pointeri ca argumente ale Up: Pointeri Previous: Introducere   Cuprins
Cristian Gavrila 2001-10-02