Funktionszeiger

Ein Funktionszeiger ist eine Zeigervariable, die auf eine Funktion zeigt.

Normalerweise zeigt die Zeigervariable, von der wir sprechen, auf eine Variable wie eine Ganzzahl, ein Zeichen oder ein Array, während ein Funktionszeiger auf eine Funktion zeigt.

Ein Funktionszeiger kann wie eine normale Funktion verwendet werden, um Funktionen aufzurufen und Parameter zu übergeben.

Deklaration des Funktionszeigertyps:

typedef int (*fun_ptr)(int,int); // 声明一个指向同样参数、返回值的函数指针类型

Beispiel

Das folgende Beispiel deklariert eine Funktionszeigervariable p, die auf die Funktion max zeigt:

Beispiel

#include <stdio.h> int max(int x, int y) { return x > y ? x : y; } int main(void) { /*p ist ein Funktionszeiger*/ int (* p)(int, int) = & max; // & kann weggelassen werden int a, b, c, d; printf("Bitte geben Sie drei Zahlen ein:"); scanf("%d %d %d", & a, & b, & c); /*Entspricht dem direkten Aufruf der Funktion, d = max(max(a, b), c)*/ d = p(p(a, b), c); printf("Die größte Zahl ist: %d\n", d); return 0; }

Kompilieren und ausführen, das Ausgabeergebnis ist wie folgt:

请输入三个数字:1 2 3
最大的数字是: 3

Callback-Funktion

Funktionszeiger als Parameter einer Funktion

Eine Funktionszeigervariable kann als Parameter einer Funktion verwendet werden; eine Callback-Funktion ist eine Funktion, die über einen Funktionszeiger aufgerufen wird.

Einfach gesagt: Eine Callback-Funktion ist eine Funktion, die Sie implementieren und die während der Ausführung der Funktion eines anderen aufgerufen wird.

Das Folgende ist eine Erklärung des Zhihu-Autors Chang Xiling:

Sie gehen in ein Geschäft, um etwas zu kaufen, aber der gewünschte Artikel ist zufällig nicht vorrätig, also hinterlassen Sie dem Verkäufer Ihre Telefonnummer. Ein paar Tage später ist der Artikel vorrätig, und der Verkäufer ruft Sie an; nachdem Sie den Anruf erhalten haben, gehen Sie in das Geschäft, um den Artikel abzuholen. In diesem Beispiel wird Ihre Telefonnummer als Callback-Funktion bezeichnet, das Hinterlassen Ihrer Telefonnummer beim Verkäufer wird als Registrieren der Callback-Funktion bezeichnet, das spätere Eintreffen des Artikels im Lager wird als Auslösen des mit dem Callback zusammenhängenden Ereignisses bezeichnet, der Anruf des Verkäufers bei Ihnen wird als Aufrufen der Callback-Funktion bezeichnet, und dass Sie in das Geschäft gehen, um den Artikel abzuholen, wird als Reagieren auf das Callback-Ereignis bezeichnet.

Beispiel

Im Beispiel definiert diepopulate_array()Funktion drei Parameter, von denen der dritte ein Funktionszeiger ist; die Array-Werte werden durch diese Funktion gesetzt.

Im Beispiel haben wir eine Callback-Funktion definiertgetNextRandomValue()Sie gibt einen Zufallswert zurück und wird als Funktionszeiger an diepopulate_array()Funktion übergeben.

populate_array()ruft10die Callback-Funktion auf und weist den Rückgabewert der Callback-Funktion dem Array zu.

Beispiel

#include <stdlib.h> #include <stdio.h> void populate_array(int *array, size_t arraySize, int (*getNextValue)(void)) { for (size_t i=0; i<arraySize; i++) array[i] = getNextValue(); } // Zufallswert abrufen int getNextRandomValue(void) { return rand(); } int main(void) { int myarray[10]; /*getNextRandomValue darf keine Klammern haben, sonst lässt es sich nicht kompilieren, weil das Hinzufügen von Klammern gleichbedeutend damit ist, ein int als diesen Parameter anstelle eines Funktionszeigers zu übergeben*/ populate_array(myarray, 10, getNextRandomValue); for(int i = 0; i < 10; i++) { printf("%d ", myarray[i]); } printf("\n"); return 0; }

Kompilieren und ausführen, das Ausgabeergebnis ist wie folgt:

16807 282475249 1622650073 984943658 1144108930 470211272 101027544 1457850878 1458777923 2007237709 
Weitere Erweiterungen