Funktsioonide tüübid ja viidad

Iga funktsioon omab isiklikku tüüpi. Peale töö lõppu loovutab funktsioon seda tüüpi muutuja teda välja kutsunud funktsioonile. Selleks kasutab ta võtmesõna return. Nimetatud võtmesõna abil on võimalik funktsiooni tööd ka enneaegselt lõpetada (näiteks mingi vea puhul) ja loovutada väljakutsujale mingi teine väärtus. Näiteks:

/* funktsioon loovutab oma väljakutsujale viida sümbolite jadale */
char* Func1(char *pStr1, char *pStr2)	
{
  if((pStr1== NULL) || (pStr2 == NULL))
   return NULL;	/* kui üks viitadest kuhugi ei osuta, siis loovuta NULL */
  else 		/* vastasel juhul lisa teine jada esimese lõppu */
   return strcat(pStr1, pStr2);
}
...
char *pStr1, *pStr2, *pStr3;
...
pStr3 = Func1(pStr1, pStr2) + 5; /* funktsiooni kasutamine valemi osana */

Programmeerimiskeeles C on funktsioon nagu omapärast tüüpi muutujaks, mis loovutab oma väärtuse vaid peale hetkelist "mõtteaega". Muus osas on funktsioon nagu harilik muutuja ja teda saab seega sisestada avaldise suvalisse ossa, välja arvatud omistustehte vasakule poolele. Funktsioonile ei saa ju mingit väärtust omistada. Selle asemel võib ta aga ise omistada muutujatele väärtusi.

Kui funktsiooni (tema väärtuse) tüübiks on void, siis ei loovuta funktsioon oma väljakutsujale mingeid andmeid ja seega ei saa teda ka enam kasutada avaldise osana.

Te võite defineerida viitasid funktsioonidele. Selline viit erineb harilikust viidast selle poolest, et tema poolt osutatud mälupesa väärtust ei saa enam otse lugeda. Te võite aga sellise viida abil vastava funktsiooni välja kutsuda ja tema tulemuse omistada mingile muutujale. Funktsioonide viitasid kasutatakse näiteks sageli menüüde implementeerimiseks. Iga menüükäsk omaks viita vastavale funktsioonile ja selle menüükäsu valimisel kutsutaksegi too funktsioon välja. Viita funktsioonile võiks defineerida järgneva kirjega:

<funktsiooni väärtuse tüüp> (*<viida nimi>)(<parameetrite loetelu>);

Näiteks:

char* (*pFunc1)(char*, char*);
...
pFunc1 = Func1;	/* funktsioon Func1() on defineeritud
                   eelmises näites */
...
       /* vananenud viis funktsiooni viida kasutamiseks */	
pStr3 = (*pFunc1)(pStr1, pStr2) + 5; 
       /* uuem (ANSI standard) viis funktsiooni viida kasutamiseks */
pStr3 = pFunc1(pStr1, pStr2) + 5; 

Funktsiooni viitasid võib salvestada massividesse (jällegi oleks sobivaks näiteks menüüde implementeerimine). Massiivi suurust määrav number nurksulgudes ei tohiks aga olla sellise rea lõpus, vaid kohe peale massiivi nime:

<funktsiooni väärtuse tüüp> (*<viida nimi>[<massiivi suurus>])(<parameetrite loetelu>);

Näiteks:

void (*MenuFunc[10])(void);