|
Dac? acest studiu s-ar dori exhaustiv, ar trebui s? preciz?m c? la început a fost haosul… Cu riscul de a p?rea superficiali, vom s?ri îns? peste unele etape ce nu fac obiectul prezentei lucr?ri, pentru a surprinde gestul omului de cromagnon care, vizibil afectat de urm?rile transform?rii energiei cinetice in energie poten?ial? de deformare la interac?iunea dintre propria regiune lombar? ?i instrumentul complementar al vecinului de grot? (bâta), î?i îndreapt? mâna spre zona precedentului contact, acuzând astfel sursa senza?iei de disconfort. A?a a luat na?tere conceptul de pointer.
Mai târziu ajungem în anul 1853 când se împlineau deja cinci ani de la Revolu?ia din 1848…
F?când o parantez?, putem preciza c? în informatic? (în limbajele de programare de nivel mediu ?i înalt) pointerii, ca no?iune, au fost introdu?i din necesitatea de a controla pozi?ia efectiv? în memorie atât a datelor (varibile, vectori, structuri etc.) cât ?i a codului (func?ii ?i proceduri). Pentru a în?elege ce este un pointer la o func?ie trebuie ?tiut întâi ?i întâi c?, pentru calculator, între date ?i cod nu exist? nici o diferen?? (la fel cum pentru personajul nostru prezentat mai sus nu exista nici o diferen?? între sunetele emise, dintre care spicuim : “aaarrrg”,”aaaaaa”,”uuuuuu”,”a”). Astfel, dac? ni?te variabile declarate ca
int a = 10;
char b = 65;
char c = ‘a’;
vor fi reprezentate în memorie sub forma a 4 octe?i cu valorile respectiv 10,0,65,97, o func?ie precum
void NuAmShtiutCeNumeSaDauFunctzieiAsteiaAsaCaAmScrisChestiaAsta()
{
a = 2;
}
va fi mai întâi tradus? în instruc?iunea primar? pentru atribuire a procesorului (mov) , linia
a = 2;
devenind :
mov [a],2
care va fi apoi codificat? în 6 octe?i cu valorile respectiv 199, 6, XL, XH, 2, 0, unde XL este octetul cel mai pu?in semnificativ al adresei lui a iar XH este octetul cel mai semnificativ al aceleia?i adrese (presupunând un model de memorie în care adresa se reprezint? pe 2 octe?i). Un pointer la func?ia ar?tat? mai sus va fi o variabil? care va con?îne adresa octetului cu valoarea 192. Generalizând, un pointer la o func?ie oarecare este adresa primului octet al reprezent?rii în memorie a codului acelei func?ii. Acestea fiind spuse, nu ne r?mâne decât s? ar?t?m cum se pot folosi ace?ti pointeri la func?ii într-un program C :
#include
// Asha se declara un pointer la o functzie :
void (AstaEUnPointerLaOFunctzieCareAcceptaUnParametruIntreg*)(int a);
void AstaEOFunctzieCareScriePeEcranParametrulIntregPrimit( int a )
{
printf( “%d”,a );
}
void main()
{
// Asha se face o atribuire a unui pointer la o functzie :
// ( numele functziei fara parantezele subfixate inseamna pointer la acea
// functzie )
AstaEUnPointerLaOFunctzieCareAcceptaUnParametruIntreg =
AstaEOFunctzieCareScriePeEcranParametrulIntregPrimit;
// Iar acum putem apela functzia de mai sus prin pointerul la ea :
AstaEUnPointerLaOFunctzieCareAcceptaUnParametruIntreg( 666 );
}
2. Efectul de supraînc?rcare (întrucâtva) a func?iilor
Apelul func?iilor într-un program nu este foarte diferit de metoda rustic? prin care aten?ia unui individ este solicitat? dup? sistemul : “B? Ghorgheeeeeee !!!!!!". La fel ?î o func?ie este chemat? s? se execute dup? numele s?u. Problema apare îns? când mai multe func?ii au acela?i nume ?i nu se poate decide care dintre ele trebuie chemat?. În aceast? situa?ie geniul popular î?i dovede?te înc? o dat?, dac? mai era nevoie, valoarea sa incontestabil? prin g?sirea unui expedient ce face ca aceast? problem? s? par? eminamente facil?, eludând astfel de o manier? existen?ial categoric? impasul ini?ial. Solu?ia creatorului anonim const? în unicizarea obiectului apelului s?u prin suplimentarea interpel?rii cu o serie de entit??i intrinsec informa?ionale ?i coerent formale. Astfel, în momentul în care o solicitare î?i pierde comprehensibilitatea devenind echivoc? (precum ar face precedentul nostru exemplu în prezum?ia apari?îei unui al doilea Gheorghe), aceasta este instinctual transfigurat? ?i coercitiv reformat? pentru a reflecta în mod irefutabil elocvent inten?ionalitatea ini?ial? a apelantului, numelui adresatului fiindu-i adi?ionate o serie de atribute a c?ror juxtapunere îi confer? acestuia o unicitate rela?ional cognitiv? : “Gheorghe a Marii Gherghinii lu’ nea Fane tractoristu’ d-a ?inut p-aia lu’ Marin a lu’ Gheorghe-al Janii dân capu’ satului”.
|