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