Variabile de tip pointeri în C – pointer la o funcţie

În cazul variabilelor de tip pointer la o funcție e un pic mai complicat. In variabila pointer se stochează adresa funcției. Adresa respectivă poate să se afle într-un alt fișier c sau chiar într-un dll. 

Reguli

Trebuiesc respectate două reguli de bază pentru a avea un cod cat mai clar:
1. Pentru apelul funcțiilor este imperativ sa se folosească parantezele ().
2. Pentru a prelua adresa unei funcții se folosește operatorul de adresă &.

<br />void functie_1 (void)<br />{<br />  /* codul tau aici */<br />}<br /><br />void functie_2 (void)<br />{<br />  /* codul tau aici */<br />}<br /><br />void g (void) {<br />/* converted to "pointer to"* and assigned */<br />void (*pf_1)(void) = &functie_1;<br />/* converted to "pointer to"* and assigned */ <br />void (*pf_2)(void) = &functie_2;<br /><br />functie_1(); /* apel al functiei 1 */<br />pf_1();      /* si acesta e un apel al functiei 1*/    <br />pf_2();      /* acesta e un apel al functiei 2 */    <br />}<br />
<br />/*un exemplu mai obscur dar de asemenea corect */<br />void f (void)<br />{<br /> ;<br />}<br />void g (void) {<br />void (*pf)(void) = &f;<br />&f();<br />(*pf)();<br />}<br />
<br />/*<br />* In exemplul de mai jos toate apelurile de functii sunt echivalente<br />*/<br />void f (void)<br />{<br /> ;<br />}<br />void g (void)<br />{<br />f();<br />(f)();<br />(*f)();<br />(**f)();<br />(*******f)();<br />(&f)();<br />}<br />
<br />/* Utilizarea operatorului de adresa este redundant <br />   dar este foarte util pentru cel care citeste codul */<br />int f (void) {<br />   /* code */<br />}<br />void g (void) <br />{<br />  if (f != 0) /* suspicios */<br />  {<br />   ;<br />  }<br />  if (f() != 0) /* se face de fapt verificarea return-ului <br />functiei care este void - e cam obscur */<br />  {<br />   ;<br />  }<br />  if ( &f != 0) /* redundant, dar foarte clar */<br />  {<br />   ; <br />  }<br /> }<br />}<br />

Opinia mea

Sugestia mea este sa păstrați codul cat mai simplu.Credeți-mă, o să încercaţi să înțelegeți codul peste 2-3 luni și o să vă fie foarte ușor.
Conceptul K.I.S. (Keep It Simple) ar trebui să se aplice peste tot, inclusiv în programare. (sau K.I.S.S. Keep It Simple Stupid 🙂 )

Acum ceva vreme am căutat prin codul scris prin facultate şi m-am chinuit un pic până să înțeleg.

Documentație

Alte tutoriale mai detaliate: http://www.cprogramming.com/tutorial/function-pointers.html
http://www.tutorialspoint.com/cplusplus/cpp_function_call_by_pointer.htm

Pentru cei care vor să înveţe C atunci cumpăraţi cartea C Programming Language (2nd Edition) scrisă de Dennis M. Ritchie şi Brian W. Kernighan

De admin

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *


The reCAPTCHA verification period has expired. Please reload the page.