Variabile de tip pointeri în C - pointer la o funcţie (2)

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

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

Etichete

Afișați mai multe

Arhiva

Afișați mai multe