c idioma maestro oro
& gt2:char title[100];
& gt3:int(* func)();
& gt4: } tip callbacks;
Para decirlo sin rodeos, es un puntero de función
En pocas palabras, como int add(int, int int min(int, int); Para funciones con los mismos parámetros y funciones que devuelven valores, si desea manejarlas de manera general, defina un puntero de función:
int (*function)(int, int
);De esta manera, el puntero de función puede apuntar a cualquier función verdaderamente definida:
Función = &O función=&min
Puntero de función Un puntero de función es una variable de puntero que apunta a una función.
Por lo tanto, el "puntero de función" en sí debería ser primero una variable de puntero, pero la variable de puntero apunta a una función. Esto es como usar variables de puntero para señalar variables enteras, tipos de caracteres y matrices, aquí apuntan a funciones. Como se mencionó anteriormente, al compilar C, cada función tiene una dirección de entrada, que es la dirección a la que apunta el puntero de función. Al usar una variable de puntero para señalar una función, puede usar esta variable de puntero para llamar a una función, al igual que puede usar una variable de puntero para hacer referencia a otros tipos de variables. Estos conceptos son consistentes. Los punteros de función tienen dos usos: llamar a funciones y servir como parámetros de función. El método de explicación del puntero de función es:
Identificador de tipo de datos (nombre de variable de puntero) (lista de parámetros);
Nota 1: "Tipo de función" indica el tipo de retorno de la función. Debido a que "()" tiene mayor prioridad que "*", los paréntesis fuera del nombre de la variable de puntero son necesarios y la siguiente "lista de parámetros" representa la lista de parámetros de la función a la que apunta la variable de puntero. Ejemplo
int func(int x); /*Declarar una función*/
int(* f)(int x); /*Declarar un puntero de función*/
f = func/*Asigna la primera dirección de la función func al puntero f */
La función func no tiene paréntesis ni parámetros durante la asignación. Dado que func representa la primera dirección de la función, después de la asignación, el puntero f apunta a la primera dirección del código de func(x).
Nota 2: Los parámetros formales entre paréntesis de función son opcionales, dependiendo de la situación.
El siguiente programa ilustra el método de llamar a una función desde un puntero de función:
Realización 1,
# include & ltstdio.h & gt
int max(int x, int y){ return(x>y?x:y);}
void main()
{
int (*ptr)(int, int);
int a, b, c
ptr = max
scanf("% d, %d ",&一,&b);
c=(*ptr)(a,b);
printf("a=%d,b=%d , max=%d ", a, b, c);
}
Ptr es una variable puntero de una función, por lo que puedes asignar la función max() a ptr como valor ptr, es decir, asigne la dirección de entrada de max () a ptr, y luego podrá usar ptr para llamar a esta función. De hecho, tanto ptr como max apuntan a la misma dirección de entrada, pero la diferencia es que ptr es una variable de puntero, a diferencia del nombre de la función, puede apuntar a cualquier función, depende de cómo lo hagas. Apunta a cualquier función del programa al que está asignada la dirección. Luego llámelo con una variable de puntero, que puede apuntar a diferentes funciones una tras otra. Sin embargo, tenga en cuenta que la variable de puntero que apunta a la función no tiene operaciones ++ y -, así que tenga cuidado al usarla.
Sin embargo, en algunos compiladores esto no es transitivo. Este ejemplo se complementa de la siguiente manera.
Debería ser así:
1. Defina el tipo de puntero de función:
typedef int (*fun_ptr)(int, int);
2. Declarar variables y asignar valores:
fun _ ptr max _ func = max
En otras palabras, la función asignada al puntero de función debe ser la misma que el prototipo de función señalado por el puntero de función es consistente.
Realización 2,
# include & ltstdio.h & gt
void FileFunc()
{
printf(" función de archivo \ n ");
}
void EditFunc()
{
printf(" función de edición \ n ");
}
void main()
{
void(* funcp)();
p>funcp = FileFunc
(* funcp)();
funcp = EditFunc
(* funcp)();
}
La diferencia entre funciones de puntero y punteros de función
1. Ambos conceptos son abreviaturas. Las funciones de puntero se refieren a funciones con punteros, es decir, son esencialmente funciones. . Sabemos que todas las funciones tienen un tipo de retorno (sin valor significa sin valor), pero el tipo de retorno de una función de puntero es un puntero de cierto tipo.
El formato de la definición es el siguiente:
Identificador de tipo de retorno * nombre de retorno (lista de parámetros formales)
{Cuerpo de función}
Los tipos de retorno pueden ser cualquier tipo primitivo y compuesto. Las funciones que devuelven punteros se utilizan ampliamente. De hecho, cada función, incluso si no devuelve un puntero de cierto tipo, tiene su propia dirección de entrada, que es equivalente a un puntero. Por ejemplo, si una función devuelve un valor entero, en realidad es equivalente a devolver el valor de una variable de puntero, pero la variable en este momento es solo la función en sí, y toda la función es equivalente a una "variable". Por ejemplo, aquí hay un ejemplo de una función que devuelve un puntero:
#includes
float *find()
main()
{
Puntuación de coma flotante estática[][4]={{60, 70, 80, 90}, {56, 89, 34, 45}, {34, 23, 56, 45 } };
float * p;
int i, m;
printf("Ingrese el número que desea encontrar:"); p>
scanf ("%d ", & ampm);
printf("La puntuación %dth es:\n ", m
p=find(); puntuación, m) ;
for(I = 0;i<4;i++)
printf(" % 5.2f \ t " ,*(p+I));
}
Float * find (float (* pioneer) [4], int n)/*Definir función de puntero*/
{
float * pt
pt = *(pienter+n);
Return (pt);
}
El número de estudiante comienza Contando desde 0, la función find() se define como una función de puntero y el puntero de parámetro formal es una variable de puntero que apunta a una matriz unidimensional que contiene cuatro elementos. El puntero +1 apunta a la primera fila de puntuaciones. *(puntero+1) apunta al elemento 0 de la primera fila. Pt es una variable de puntero que apunta a una variable de punto flotante. Llame a la función find() en la función main() y pase la primera dirección de la matriz de puntuaciones al puntero.
2. El "puntero de función" es una variable de puntero que apunta a una función, por lo que el "puntero de función" en sí primero debe ser una variable de puntero, pero la variable de puntero apunta a una función. Esto es como usar variables de puntero para señalar variables enteras, tipos de caracteres y matrices, aquí apuntan a funciones.
Como se mencionó anteriormente, al compilar C, cada función tiene una dirección de entrada, que es la dirección a la que apunta el puntero de función. Al usar una variable de puntero para señalar una función, puede usar esta variable de puntero para llamar a una función, al igual que puede usar una variable de puntero para hacer referencia a otros tipos de variables. Estos conceptos son consistentes. Los punteros de función tienen dos usos: llamar a funciones y servir como parámetros de función.
El método de interpretación de los punteros de función es:
Identificador de tipo de datos (*nombre de variable de puntero) (parámetro);
Nota 1: Los parámetros entre corchetes de función son opcional y depende de la situación. El siguiente programa ilustra el método de llamar a una función desde un puntero de función:
#Includes
int max(int x, int y){ return(x>y?x :y) ;}
void main()
{
int(* ptr)();
int a, b , c;
ptr = max
scanf("%d, %d ", & amp一, & ampb); )(a , b);
printf("a=%d, b=%d, máx=%d ", a, b, c
}); p>
Ptr es una variable de puntero de una función, por lo que puede asignar la función max() a ptr como el valor de ptr, es decir, asignar la dirección de entrada de max() a ptr, y luego puede usar ptr para llamar a esta función. De hecho, tanto ptr como max apuntan a la misma dirección de entrada, pero la diferencia es que ptr es una variable de puntero, a diferencia del nombre de la función, puede apuntar a cualquier función, depende de cómo lo hagas. Apunta a cualquier función del programa al que está asignada la dirección. Luego llámelo con una variable de puntero, que puede apuntar a diferentes funciones una tras otra. Sin embargo, tenga en cuenta que la variable de puntero que apunta a la función no tiene operaciones ++ y -, así que tenga cuidado al usarla.
Acerca de la definición de matriz de punteros de función
Hay dos formas de definir la matriz de punteros de función: una es el método estándar y la otra es el engaño.
1. Método estándar:
{
Análisis: una matriz de punteros de función es una matriz cuyos elementos son punteros de función. En otras palabras, esta estructura de datos es una matriz y sus elementos son punteros a las direcciones de entrada de la función.
Según el análisis: Primero, es una matriz: nombre de matriz []
En segundo lugar, es necesario especificar el puntero del tipo de datos de sus elementos: *nombre de matriz [].
En tercer lugar, es necesario dejar claro que cada elemento de la matriz es un puntero a la dirección de entrada de la función: tipo de valor de retorno de la función (*nombre de la matriz[])(). Tenga en cuenta por qué "*nombre de matriz []" se expande entre corchetes aquí. Debido a que los paréntesis y los especificadores de matriz tienen la misma prioridad, si los paréntesis no se usan para expandir la expresión de descripción de la matriz de punteros, ¿qué significa *nombre de matriz []() según la dirección de combinación de paréntesis y corchetes? Es una matriz de funciones cuyo tipo de valor de retorno de elemento es un puntero. ¿Existe tal función ancestro? No lo sé, así que tengo que ponerlo entre corchetes para asegurarme de que cada elemento de la matriz sea un puntero.
}
2. Método de engaño:
Aunque esta función no es una variable, todavía tiene su dirección física en la memoria y esta dirección se puede asignar. a la variable de puntero. La forma de obtener una función es utilizar el nombre de la función sin paréntesis ni argumentos.
El nombre de la función equivale a un puntero constante que apunta a su entrada de función. Entonces, dado que el nombre de la función es una constante de puntero, se puede realizar algún procesamiento correspondiente, como la conversión de tipo forzada.
Luego podemos poner esta dirección en una matriz de punteros enteros y llamarla como un puntero de función.
Ejemplo completo:
#Contiene "stdio.h"
int add1(int a1, int b 1);
int add2(int a2, int B2);
void main()
{
int numa1=1, entumecido 1 = 2;
int numa2=2,numb 2 = 3;
int (*op[2])(int a, int b);
op[0]= agregar 1;
op[1]= agregar 2;
printf("%d %d\n ",op[0](numa1,numb1),op[1](numa2, entumecido 2);
}
int add1(int a1, int b1)
{
Devuelve a 1+b 1;
}
int add2(int a2, int b2)
{
Devuelve a2+B2;
}
A continuación se dan las definiciones comunes de las variables C:
a) Entero.
b) Puntero a número entero.
c) Puntero a puntero, puntero a entero (puntero a entero)
d) Array de 10 enteros.
e) Hay una matriz de 10 punteros, que apuntan a un número entero (10 punteros apuntan a una matriz de números enteros).
f) Puntero a una matriz de 10 números enteros.
g) Un puntero a una función que toma un argumento entero y devuelve un número entero (un puntero a una función que toma un número entero como argumento y devuelve un número entero).
h) Una matriz con 10 punteros que apuntan a una función que toma un parámetro entero y devuelve un número entero (una matriz de diez punteros apunta a una función que toma un parámetro entero y devuelve un número entero).
La respuesta es:
a)int a; //entero
b)int * a; //puntero a entero
>c)int * * a; //Puntero a puntero entero
d)int a[10] //Matriz de 10 enteros
e)int * a[ 10] ; //Matriz de 10 punteros a números enteros
f)int(* a)[10] //Puntero a matriz de 10 números enteros
g)int( * a)( int); //Puntero a la función A que toma parámetros enteros y devuelve un número entero
h)int(* a[10])(int); //Matriz de 10 punteros. Estos punteros apuntan a funciones. que toman argumentos enteros y devuelven números enteros