Puntero a función

Un puntero a función es una variable puntero que apunta a una función.

Normalmente, cuando hablamos de variables puntero, nos referimos a variables que apuntan a un entero, un carácter, un arreglo, etc., mientras que un puntero a función apunta a una función.

Un puntero a función puede usarse como una función normal, para invocar funciones y pasar parámetros.

Declaración de un tipo de puntero a función:

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

Ejemplo

El siguiente ejemplo declara una variable puntero a función p, que apunta a la función max:

Ejemplo

#include <stdio.h> int max(int x, int y) { return x > y ? x : y; } int main(void) { /*p es un puntero a función*/ int (* p)(int, int) = & max; // & se puede omitir int a, b, c, d; printf("Por favor ingrese tres números:"); scanf("%d %d %d", & a, & b, & c); /*Equivalente a llamar directamente a la función, d = max(max(a, b), c)*/ d = p(p(a, b), c); printf("El número más grande es: %d\n", d); return 0; }

Compile y ejecute, el resultado de salida es el siguiente:

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

Función de devolución de llamada

Puntero a función como parámetro de una función

Una variable puntero a función puede usarse como parámetro de una función; una función de devolución de llamada es una función que se invoca a través de un puntero a función.

En términos simples: una función de devolución de llamada es una función que tú implementas y que es invocada cuando se ejecuta la función de otra persona.

La siguiente es una explicación de Chang Xiling, autor de Zhihu:

Vas a una tienda a comprar algo, justamente lo que quieres no está en stock, entonces le dejas tu número de teléfono al empleado. Unos días después la tienda tiene el artículo, el empleado te llama, y cuando recibes la llamada vas a la tienda a recogerlo. En este ejemplo, tu número de teléfono se llama función de devolución de llamada; dejarle el teléfono al empleado se llama registrar la función de devolución de llamada; que la tienda tenga el artículo después se llama disparar el evento asociado a la devolución de llamada; que el empleado te llame se llama invocar la función de devolución de llamada; y que tú vayas a la tienda a recoger el artículo se llama responder al evento de devolución de llamada.

Ejemplo

En el ejemplopopulate_array()La función define tres parámetros, donde el tercer parámetro es un puntero a una función, y a través de esa función se establecen los valores del arreglo.

En el ejemplo definimos una función de devolución de llamadagetNextRandomValue(), que devuelve un valor aleatorio, y se pasa como puntero a función apopulate_array()la función.

populate_array()Se llamará10veces a la función de devolución de llamada, y el valor de retorno de la función de devolución de llamada se asignará al arreglo.

Ejemplo

#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(); } // Obtener un valor aleatorio int getNextRandomValue(void) { return rand(); } int main(void) { int myarray[10]; /*getNextRandomValue no puede llevar paréntesis, de lo contrario no compilará, porque al añadir paréntesis equivaldría a pasar un int como este parámetro, en lugar de un puntero a función.*/ populate_array(myarray, 10, getNextRandomValue); for(int i = 0; i < 10; i++) { printf("%d ", myarray[i]); } printf("\n"); return 0; }

Compile y ejecute, el resultado de salida es el siguiente:

16807 282475249 1622650073 984943658 1144108930 470211272 101027544 1457850878 1458777923 2007237709 
Otras extensiones