Una vez que una función es compilada y cargada en el computador para ser ejecutada, ocupa un trozo de memoria. Esta memoria, y por tanto esa función, tiene una dirección.
C nunca ha sido un lenguaje que impida entrar donde otros temen pisar. Puede usar direcciones de función con punteros igual que puede usar direcciones de variables. La declaración y uso de punteros a función parece un poco opaca al principio, pero sigue el formato del resto del lenguaje.
Para definir un puntero a una función que no tiene argumentos y no retorna nada, se dice:
void (*funcPtr)();
Cuando se observa una definición compleja como ésta, el mejor método para entenderla es empezar en el medio e ir hacia afuera. «Empezar en el medio» significa empezar con el nombre de la variable, que es funcPtr. «Ir hacia afuera» significa mirar al elemento inmediatamente a la derecha (nada en este caso; el paréntesis derecho marca el fin de ese elemento), después mirar a la izquierda (un puntero denotado por el asterisco), después mirar de nuevo a la derecha (una lista de argumentos vacía que indica una función que no toma argumentos), después a la izquierda (void, que indica que la función no retorna nada). Este movimiento derecha-izquierda-derecha funciona con la mayoría de las declaraciones. [47]
Para repasar, «empezar en el medio» («funcPtr es un ...»), va a la derecha (nada aquí - pare en el paréntesis derecho), va a la izquierda y encuentra el * («... puntero a ...»), va a la derecha y encuentra la lista de argumentos vacía («... función que no tiene argumentos ...»), va a la izquierda y encuentra el void («funcPtr es un puntero a una función que no tiene argumentos y retorna void»).
Quizá se pregunte por qué *funcPtr necesita paréntesis. Si no los usara, el compilador vería:
void *funcPtr();
Estaría declarando una función (que retorna un void*) en lugar de definir una variable. Puede pensar que el compilador sigue el mismo proceso que usted cuando averigua qué se supone que es una declaración o una definición. El compilador necesita los paréntesis para «chocar contra ellos» y así volver hacia la izquierda y encontrar el *, en lugar de continuar hacia la derecha y encontrar la lista de argumentos vacía.
[47] (N. del T.) Otra forma similar de entenderlo es dibujar mentalmente una espiral que empieza en el medio (el identificador) y se va abriendo.