En el lenguaje C, el término identificador se usa para referirse a nombres de cosas, incluyendo variables, matrices, funciones, etc. Los nombres identifican cosas. Todos los nombres de variables son identificadores, pero no todos los identificadores son nombres de variables.
Los nombres de funciones en sí mismos no son variables. No puede cambiar el valor del nombre de la función, que es la dirección de memoria del comienzo de las instrucciones de la función. (Del mismo modo, un nombre de matriz tampoco es una variable. No puede cambiar el valor del nombre de la matriz, que es la dirección de memoria del primer elemento de la matriz).
Ahora, una variable cuyo tipo de datos es puntero a función puede contener la dirección de una función (es decir, un puntero de función). Por lo tanto, puede almacenar la dirección de una función en una variable diseñada para contener la dirección de una función. Luego puede usar esa variable para llamar a la función. Pero la variable no es el nombre de la función. La variable contiene la dirección de la función.
Considere el siguiente ejemplo:
- ¿Qué son las funciones range () con ejemplos en Python?
- ¿Cuál es el valor de x en [matemáticas] | x-1 | + | x-2 | = x [/ matemáticas]?
- ¿Cómo pruebo que alguna función f (t) es una función característica de una variable aleatoria?
- ¿Sabemos que la integral del pecado (x ^ 2) no se puede expresar en términos de funciones elementales o simplemente no hemos podido hacerlo?
- Si f (x) = sin ^ 2 (x) + cos ^ 4 (x), ¿cuál será el rango de f?
#include doble ConvertCelsiusToKelvin (doble grados Celsius) { volver grados Celsius - 273,15; } double ConvertKelvinToCelsius (double kelvinDegrees) { return kelvinDegrees + 273.15; } int main (nulo) { // define una variable de puntero de función doble (* myFnPtr) (doble); myFnPtr = ConvertCelsiusToKelvin; printf ("Resultado 1:% f \ n", myFnPtr (42.0)); myFnPtr = ConvertKelvinToCelsius; printf ("Resultado 2:% f \ n", myFnPtr (42.0)); devuelve 0; }
En este ejemplo, ConvertCelsiusToKelvin y ConvertKelvinToCelsius son nombres de funciones. Los valores son direcciones de memoria fijas, que son las direcciones de las primeras instrucciones en cada función. Los nombres de las funciones no son variables; No pueden ser cambiados.
Ahora, dentro de la función principal, hemos definido una variable llamada myFnPtr. Su tipo de datos es puntero a la función que recibe un doble y devuelve un doble. En otras palabras, myFnPtr es una variable de puntero de función. Podemos cambiar hacia dónde apunta. Primero almacenamos la dirección de la función ConvertCelsiusToKelvin en la variable. Entonces podemos usar myFnPtr para llamar a la función. Más tarde, podemos cambiar dónde apunta myFnPtr almacenando una dirección de función diferente en él. En este caso, almacenamos la dirección ConvertKelvinToCelsius en la variable, y utilizan la variable para llamar a la función.
Entonces, los nombres de las funciones son identificadores cuyos valores son las direcciones de las funciones, pero no son variables. La variable de puntero de función myFnPtr es una variable, y podemos almacenar diferentes direcciones de función en esa variable y usar esa variable para llamar a las funciones.
(Este es un ejemplo artificial, y no demuestra un uso típico de punteros de función, pero ilustra la distinción entre nombres de función y variables de puntero de función).