Funktionszeiger in C

Funktionszeiger sind Zeiger, die die Anfangadresse von Funktionen enthalten. Die Deklaration eines Funktionszeigers fptr, der auf die Anfangsadresse einer Funktion f mit einem double-Parameter und Rückgabewert double zeigt, erfolgt wie in Zeile 3 des Beispiels: Rückgabewert und Parameter der Funktion müssen auch für den Funktionszeiger korrekt angegeben werden.

double f(double x) { return x*x; }
int main(void) {
  double (*fptr) (double) = f;
  printf("%.0lf, %.0lf\n", fptr(2), fptr(3)); // Ausgabe: 4, 9
}

Funktionszeiger werden insbesondere eingesetzt, um Funktionen als Parameter an andere Funktionen zu übergeben.

Beispiel: Funktionszeiger

In diesem Beispiel wird ein Funktionszeiger verwendet, um einen generischen Solver für die Berechnung des bestimmten Integrals eindimensionaler Funktionen zu schreiben. Die Funktion trapez erhält als ersten Parameter den Funktionszeiger double (*f)(double). Dadurch wird die Funktion trapez zu einem generischen Solver, der für die Integration beliebiger Funktionen verwendbar ist.
Zeile 18: Beim Funktionsaufruf wird der Parameter *f einfach durch den Namen der Funktion myfun ersetzt.
Zeile 19: Beim Funktionsaufruf wird der Parameter *f einfach durch den Namen der Sinus-Funktion ersetzt.

/**
* @brief Dies C-Programm berechnet das Integral einer Funktion mittels Trapezregel
* @date  26.04.2024
* @file  trapez.c
*/
#include <stdio.h>	
#include <math.h>
double trapez(double (*f)(double), double a, double b, int n);
double myfun(double x) { // Testfunktion
	return x*x;
}
int main(void) {
	printf("Integral int_0^1 x^2 dx = %lf\n", trapez(myfun, 0, 1, 100));
	printf("Integral int_0^3 sin(x) dx = %lf\n", trapez(sin, 0, 3, 200));
}
/**
 * @brief Funktion trapez berechnet das bestimmte Integral int_a^b f(x) dx mittels Trapezregel
 * @param f - Zeiger auf eine Funktion f
 * @param a - Linkes Ende des Wertebereichs
 * @param b - Rechtes Ende des Wertebereichs
 * @param n - Anzahl der Datenpunkte
 * @return - Näherungswert für das Integral
*/
double trapez(double (*f)(double), double a, double b, int n) {
  double h = (b - a) / n;
  double x_i = 0, sum = 0;
  for (int i = 0; i < n; i++) {
    x_i = a + i * h;
    sum += (f(x_i) + f(x_i+h));
  }
  return sum*h/2;
}

Tools, Quellen und weiterführende Links

  1. Visual Studio Community Edition: Für die Entwicklung von C-Programmen.
  2. Visual Studio C17-Unterstützung: Installieren der Unterstützung für C11 und C17 in Visual Studio.
  3. yED Graph Editor: Für die Entwicklung von Fluss­diagrammen bzw. Programm­ablauf­plänen.
  4. Jürgen Wolf, C von A bis Z: openbook.rheinwerk-verlag.de/c_von_a_bis_z/, 2020.
  5. Thomas Theis: Einstieg in C. Für Programmiereinsteiger geeignet, Galileo Press, 2014.
  6. Manfred Daussman, C als erste Programmiersprache: Vom Einsteiger zum Fortgeschrittenen. Vieweg, 2010.
  7. Axel Böttcher, Franz Kneißl. Informatik für Ingenieure: Grundlagen und Programmierung in C. Oldenbourg Verlag, 1999.
  8. Brian Kernighan, Dennis Ritchie, The C programming language. Prentice-Hall, 2010.
  9. Visual Studio C Language Reference, docs.microsoft.com/en-us/cpp/c-language/