Sunteți pe pagina 1din 3

S13.

Declaraţii cu pointeri şi interpretarea lor

Utilizarea pointerilor, benefică altminteri, poate să aducă şi neajunsuri, printre care


semnalăm dificultatea de a descifra programe sursă. Un caz tipic, îl constiuie interpretarea
declaraţiilor complexe, pentru care, în cele ce urmează se dă, sub formă de algoritm, un
îndrumar. In continuare, se dau câteva exemple, succesiunea entităţilor care se analizează
fiind marcate prin numere de ordine
1. Se începe cu identificatorul din declaraţie.
2. Se merge spre dreapta căutând o entitate sub forma unei perechi de paranteze
rotunde ( ) sau drepte [ ]. O succesiune de două sau mai multe perechi de paranteze drepte
se considerată ca o entitate unică.
3. Dacă s-a selectat o entitate, se interpretează ca funcţie, respectiv array.
4. Se schimbă sensul de deplasare înspre stânga căutând o entitate *, dată de cel
mai apropiat caracter de acest fel care nu a fost încă analizat. Dacă * este precedat de
modificatorul const, atunci această sucsesiune formează o entitate. Se interprezează
entitatea ca indicaţie de pointer sau pointer constant şi se continuă cu deplasare spre stânga.
5. Dacă în căutarea spre stânga, se întâlneşte o paranteză rotundă deschisă (, atunci
entitatea care este cuprinsă între această paranteză şi perechea ei dreapta este considerată
tratată şi algoritmul se reia de la pasul 2.
6. Dacă în căutarea spre dreapta, se ajunge la o paranteză rotundă închisă ), atunci
algoritmul se reia de la pasul 4.
7. Dacă în căutarea spre dreapta, se ajunge la sfârşitul declaraţiei, atunci se încheie
căutarea şi se interpretează declaraţia de tip.

Exemplul 1:

char* (* ( * var )(int))[10]

7 6 4 2 1 3 5

1. Identificatorul var este declarat ca


2. un pointer la
3. o funcţie care are un parametru întreg şi care returnează
4. un pointer la
5. un array de 10 elemente care sunt
6. pointeri la
7. tipul char

1
Exemplul 2:

double ( * var (double (*)[3])) [5]

5 3 1 2 4

1. Identificatorul var desemnează o funcţie care are un


parametru şi returnează
2. un pointer la
3. un array cu 3 componente
4. de tip double
Parametrul funcţiei esteun pointer la un array cu 5
componente de tipul double

Exemplul 3:

struct s * (* var[5])[5]

6 5 1 4
3 2

1. Idetificatorul var este


2. un array cu 5 componente care sunt
3. pointeri la
4. un array cu 5 componente care sunt
5. pointeri la
6. tipul struct s

2
Exemplul 4:

unsigned int * ( * const* var [5][10])(void)

7 6 4 3 1 2 5

1. Identificatorul var este


2. o matrice cu 5 linii şi 10 coloane
3. pointeri constanţi la
4. un pointer la
5. o funcţie care nu are parametrii şi returnează
6. un pointer la
7. un întreg fără semn

Declaraţiile de funcţii, incluse, se analizează în acelaşi mod, depinzând de poziţia lor.


In exemplul care urmează sunt trei funcţii, analiza începe cu funcţia intermediară. De
remarcat prezenţa parantezelor care o delimitează, fără care scrierea ar fi fost eronată
sintactic.

Exemplul 5:

void ( * var (int,double(*)(int) ) )(int)

5 3 1 2 4

1. Identificatorul var este


2. o funcţie – 1 care are doi parametri şi returnează
3. un pointer la
4. o funcţie – 2 cu un parametru întreg care returnează
5. un void
Funcţia 1 are un parametru întreg şi un parametru care este
pointer la o funcţie -3 care are un parametru intreg şi
returnează un double

S-ar putea să vă placă și