8.3. Legatura dintre pointeri si tablouri

2019/03/05 in Programare in C

Numele unui tablou este un pointer deoarece el are ca valoare adresa primului sau element. Totusi, exista o diferenta intre numele unui tablou si o variabila de tip pointer. Unei variabile de tip pointer i se atribuie valori la executie, in timp ce acest lucru nu este posibil pentru numele unui tablou. Acesta are tot timpul ca valoare adresa primului sau element. De aceea, se obisnuieste sa se spuna ca numele unui tablou este un pointer constant.

Exemplu:

int t[10];
int *p;
int x;
...
p = t;
/* in urma acestei atribuiri p are aceeasi valoare ca si t, 
adica adresa lui t[0] */

In continuare, instructiunile:

x = t[0];

si

x = *p;

au acelasi efect: atribuie lui x valoarea elementului t[0].

Un parametru formal ce corespunde unui parametru efectiv care este un nume de tablou unidimensional, poate fi declarat fie ca tablou, fie ca pointer spre tipul tabloului.

Fie declaratia:

int tab[10];

si apelul:

f(tab);

Functia f poate avea unul din urmatoarele antete:

void f(int t[])

sau

void f(int *t)

Intr-adevar, declaratia int t[] defineste pe t ca nume de tablou, iar parametrului t i se atribuie la apel valoarea lui tab, adica adresa lui tab[0]. El este alocat pe stiva si lui i se atribuie o valoare prin apelul functiei. Ulterior, vom vedea ca putem modifica valoarea lui t. Nu acelasi lucru se poate spune despre tab. Acesta este un pointer constant, a carui valoare nu poate fi schimbata la executie.

Din cele de mai sus rezulta ca parametrul t este un pointer variabil spre int si deci el poate fi declarat printr-o declaratie de forma:

int *t;

In concluzie, daca un parametru formal corespunde unui parametru efectiv care este un nume de tablou unidimensional, atnuci el poate fi declarat fie ca tablou:

tip nume_parametru_formal[]

fie ca pointer:

tip *nume_parametru_formal

8.4. Operatii cu pointeri