Advanced Java Services | Funktionspointer |
Außer den "normalen" Pointern gibt es in C und C++ auch Pointer auf Funktionen. In C# gibt es mit den Delegates ein vergleichbares Konzept, in Java gibt es Funktionspointer (bisher) nicht. Ähnlich wie Pointer auf Variablen sind auch Funktionspointer typisiert. Der Typ richtet sich dabei nach der Signatur der Funktion (inklusive des Returntyps). Der Zugang zu Funktionspointer wird am besten durch einige Beispiel klar.
Hier geben wir uns Funktionen vor und richten dazu dann einen Funktionspointer ein.
Funktion ohne Parameter und Returntyp void
void kriegt_nix_gibt_nix() { puts("kriegt_nix_gibt_nix"); }
Verwendung des Funktionspointers
// Deklaration/Definition void (*funcptr1)(); // Zuweisung funcptr1 = kriegt_nix_gibt_nix; // Aufruf funcptr1(); // Definition mit Zuweisung void (*funcptr2)() = kriegt_nix_gibt_nix;
Funktion mit zwei Parametern und Returntyp void
void kriegt_was_gibt_nix(int a, int b) { puts("kriegt_was_gibt_nix"); printf("%d %d\n", a, b); }
Verwendung des Funktionspointers
// Deklaration/Definition void (*funcptr1)(int, int); // Zuweisung funcptr1 = kriegt_was_gibt_nix; // Aufruf funcptr1(3,4); // Definition mit Zuweisung void (*funcptr2)(int, int) = kriegt_nix_gibt_nix;
Als Parameter kommen alle in C möglichen Typen in Betracht. Auch kann die Parameterliste beliebig lang sein.
Funktion mit zwei Parametern und Returntyp double
double kriegt_was_gibt_was(int a, int b) { puts("kriegt_was_gibt_was"); double erg = (double)a/b; printf("input: %d %d return: (double)a/b %lf\n", a, b, erg); return erg; }
Verwendung des Funktionspointers
// Deklaration/Definition double (*funcptr1)(int, int); // Zuweisung funcptr1 = kriegt_was_gibt_was; // Aufruf double erg = funcptr1(3,4); printf("erg = %lf", erg); // Definition mit Zuweisung double (*funcptr2)() = kriegt_was_gibt_was;
Funktion mit Pointer als Parameter und Pointer als Returntyp
char* kriegt_pointer_gibt_pointer(char *st) { puts("kriegt_pointer_gibt_pointer"); puts(st); return st; }
Verwendung des Funktionspointers
// Deklaration/Definition char* (*funcptr1)(char*); // Zuweisung funcptr1 = kriegt_pointer_gibt_pointer; // Aufruf char* erg = funcptr1("hi"); // Definition mit Zuweisung char* (*funcptr2)(char*) = kriegt_pointer_gibt_pointer;