Programación C · 3 min read · Nov 22, 2025
Tutorial de Programación en C de Linux Parte 25 - Punteros a funciones

Hasta ahora, en esta serie de tutoriales de programación en C, hemos discutido el concepto básico de punteros, así como varios aspectos relacionados con punteros, como punteros a un arreglo y arreglos de punteros. Ampliando nuestra comprensión de los punteros, en este tutorial, discutiremos el concepto de punteros a funciones.
Punteros a funciones en el lenguaje de programación C
Al igual que tenemos punteros a variables, también puede haber punteros a funciones. A continuación se muestra un ejemplo de una declaración de puntero a función:
void (*fn_ptr)(int)Así que aquí tenemos un puntero a función llamado ‘fn_ptr’ que puede apuntar a cualquier función que devuelva void y acepte un entero como entrada. No hace falta decir que esta es solo la parte de declaración; como cualquier otro puntero, necesitas asignarle una dirección (la de una función en este caso) para poder utilizarlo.
A continuación se muestra un ejemplo que utiliza este puntero:
#include
void print_int(int a)
{
printf("\n El valor entero es: %d\n",a);
}
int main()
{
void (*fn_ptr)(int);
fn_ptr = &print_int;
(*fn_ptr)(10);
return 0;
} Así que como puedes ver, primero definimos una función ‘print_int’ que acepta un entero y devuelve void. Luego, en la función ‘main’, declaramos ‘fn_ptr’ como un puntero a función que puede apuntar a funciones como ‘print_int’. Esto fue seguido por la asignación de la dirección de la función ‘print_int’ a ‘fn_ptr’, y finalmente, haciendo una llamada a la función usando el puntero.
Aquí está la salida producida:
El valor entero es: 10 Lo que vale la pena mencionar aquí es que puedes simplificar aún más este programa evitando & y * de las últimas dos líneas. A continuación se muestra el código modificado:
#include
void print_int(int a)
{
printf("\n El valor entero es: %d\n",a);
}
int main()
{
void (*fn_ptr)(int);
fn_ptr = print_int;
fn_ptr(10);
return 0;
} Avanzando, al igual que un arreglo de punteros, también puedes tener un arreglo de punteros a funciones. Por ejemplo, a continuación se muestra un arreglo de punteros a funciones capaz de almacenar 3 direcciones de funciones.
void (*fn_ptr[3])(int)Y a continuación se muestra un ejemplo que utiliza este arreglo de punteros:
void print_int1(int a)
{
printf("\n El valor entero es: %d\n",a);
}
void print_int2(int a)
{
printf("\n El valor entero es: %d\n",a+1);
}
void print_int3(int a)
{
printf("\n El valor entero es: %d\n",a+2);
}
int main()
{
void (*fn_ptr[3])(int);
fn_ptr[0] = print_int1;
fn_ptr[1] = print_int2;
fn_ptr[2] = print_int3;
fn_ptr[0](10);
fn_ptr[1](10);
fn_ptr[2](10);
return 0;
}Aquí está la salida producida por este código:
El valor entero es: 10
El valor entero es: 11
El valor entero es: 12Otro aspecto de los punteros a funciones que debes conocer es que puedes usarlos como argumentos de función también. Por ejemplo, puede haber una función que acepte un puntero a una función como argumento. Por ejemplo:
void some_random_func(void (*fn_ptr)(int)) A continuación se muestra un código de ejemplo que utiliza esta función:
#include
void another_random_func(int a)
{
printf("\n El entero ingresado es: %d\n", a);
}
void some_random_func(void (*fn_ptr)(int))
{
fn_ptr(5);
}
int main()
{
some_random_func(another_random_func);
return 0;
} Así que lo que hicimos aquí es crear una función llamada ‘some_random_func’ que acepta un puntero a función como entrada. Luego, desde ‘main’, llamamos a ‘some_random_func’ con la dirección de otra función ‘another_random_func’ como argumento. Luego, usando el puntero, llamamos exitosamente a ‘another_random_func’.
Aquí está la salida:
El entero ingresado es: 5 Conclusión
Los punteros a funciones pueden ser útiles cuando deseas crear algo llamado un ‘mecanismo de callback’ (lee más sobre ello aquí). Pero antes de entrar en eso, es mejor que tengas una buena comprensión de este concepto. Te sugerimos que intentes ejemplos de este tutorial en tu máquina local (y también crear nuevos). En caso de cualquier duda o consulta, deja un comentario abajo.
Recibe nuevas publicaciones en tu bandeja de entrada.
No spam. Cancela la suscripción en cualquier momento.