/* Ein Beispiel für die Verwendung von Funktionszeigern und void*. */ #include /* Ruft die im Funktionszeiger pf übergebenen Funktion n mal auf und übergibt * immer den Kontext ctx. n_times() selbst hat keine Kenntnis über den Aufbau * des Kontexts. Der Benutzer muss sich selbst um die korrekte Verwendung * kümmern. */ void n_times(int n, void (*pf)(void*), void* ctx) { while (n-- != 0) pf(ctx); // Kurzform von (*pf)(ctx); } /* Beim Kontext handelt es sich um einen Zeiger auf int. Um den Zeiger * verwenden zu können muss zunächst der Zeiger auf beliebiges in einen Zeiger * auf int umgewandelt werden (geschieht implizit bei der Zuweisung). * Es findet keinerlei Typprüfung statt - weder beim Übersetzen noch zur * Laufzeit des Programms. Es liegt allein am Programmierer die korrekten Typen * einzusetzen. */ void f(void* ctx) { int* pi = ctx; printf("%d\n", (*pi)++); // Klammern sind wichtig: ++ bindet stärker als *. } /* Hier wird der Kontext nicht verwendet. Entsprechend wird bei der Verwendung * unten ein ungültiger Zeiger als Kontext verwendet. */ void g(void* ctx) { printf("hallo\n"); } int main(void) { int i = 0; n_times(10, f, &i); // f: Kurzform von &f. n_times(10, g, NULL); // g: Kurzform von &g. }