In der Programmierung trifft man häufig auf den Fall, dass zur Laufzeit des Programms die auszuführende Funktion auszuwählen ist. Vor allem für Callback-Funktionen (nächster Abschnitt) ist es daher wichtig, Funktionen wie Datenstrukturen behandeln zu können. Genauso wie Datenstrukturen lassen sich daher auch Funktionen über Pointer ansprechen. 

Funktionspointer haben folgende Syntax: Rückgabewert (*PointerName)(Parameter Liste, ...)

Sie können wir normale Pointer dort definiert werden, wo sie gebraucht werden. Typischerweise verwendet man aber einen Typedef, um die sperrige Syntax zu verkürzten. 

Beispiel:

#include <stdio.h>

void foo()
{
    printf("fooooooo!\n");
}

int bar(int a)
{
    return a + a;
}

typedef void (*VoidFnPtr_t)();
typedef int (*IntFnPtr_t)(int);

int main()
{
    VoidFnPtr_t foo_ptr = &foo;
    IntFnPtr_t bar_ptr = &bar;

    foo_ptr();
    int x = bar_ptr(4);
    printf("%d\n", x);

    return 0;
}

Hier werden zwei Funktionszeiger angelegt und auf die Speicheradressen von "foo()" und "bar()" gebunden. Danach können die Funktionen über die Pointer wie gewohnt aufgerufen werden. Wichtig dabei ist, dass der Compiler die Signaturen der Funktionen prüft.  "foo()" kann so nicht aus versehen an "bar_ptr" gebunden werden. Funktionszeiger auf NULL führen zu einem Programmabsturz. 

Last modified: Friday, 1 June 2018, 12:35 PM