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
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