Los punteros a función son uno de los recursos más potentes y flexibles de C/C++, permitiendo técnicas de programación muy eficientes. Por ejemplo, escribir funciones que manejan diferentes tipos de datos; diseñar algoritmos muy compactos ("function dispatchers"), que pueden sustituir largas cadenas if...else o switch ( 4.10.2), o alterar el flujo de ejecución del programa, modificando el orden de llamadas a funciones en base a determinadas prioridades ("adaptive program flow"). Así mismo, resultan de gran ayuda en programas de simulación y modelado. Sin embargo, los autores están generalmente de acuerdo en que constituyen para el principiante uno de los puntos más confusos del lenguaje. A esto se une que el tema suele ser despachado en una par de páginas como mucho. Por lo general, exponiendo el asunto con un ejemplo cuya lógica es de por sí bastante difícil de seguir. Tómese como ejemplo el de Kernighan y Ritchie ( K&R) que por lo demás, quizás sea el libro más conciso y mejor escrito sobre C.
int (*Puntero)(int, char*);
int z = Puntero(5,"cadena");
int (*Puntero[5])(int, char*);
int z = Puntero[n](5, "cadena");
#include <stdio.h> //stdin,stdout ...#include <stdlib.h> //atoi()void suma(int,int);void resta(int,int);void multiplica(int,int);void divide(int,int);int main(int argc, char *argv[]){ //Arreglo de Punteros a funciones "suma, resta, multiplica, divide" void (*Funcion[])(int, int) = { suma, resta, multiplica, divide } ; int i,a,b; //contador y dos sumandos if(argc!=3){ printf("Usage: %s num1 num2\n",argv[0]); }else{ //convierte los parámetros char* a int para poder operar con ellos a = atoi(argv[1]); b = atoi(argv[2]); for( i = 0 ; i<4 ; i++ ){ Funcion[i](a,b); //Llamamos a cada una de las funciones en nuestro arreglo } } return 0;}void suma(int a,int b){ printf("%d + %d = %d\n",a,b,a+b);}void resta(int a,int b){ printf("%d - %d = %d\n",a,b,a-b);}void multiplica(int a,int b){ printf("%d * %d = %d\n",a,b,a*b);}void divide(int a,int b){ printf("%d / %d = %d\n",a,b,a/b);}