Programação C · 3 min read · Nov 22, 2025

Tutorial de Programação em C no Linux Parte 25 - Ponteiros de função

Até agora, nesta série de tutoriais de programação em C, discutimos o conceito básico de ponteiros, bem como vários aspectos relacionados a ponteiros, como ponteiro para um array e array de ponteiros. Expandindo nossa compreensão sobre ponteiros, neste tutorial, discutiremos o conceito de ponteiros para funções.

Ponteiros de função na linguagem de programação C

Assim como temos ponteiros para variáveis, também podem existir ponteiros para funções. A seguir, um exemplo de declaração de um ponteiro de função:

void (*fn_ptr)(int)

Aqui temos um ponteiro de função chamado ‘fn_ptr’ que pode apontar para qualquer função que retorne void e aceite um inteiro como entrada. Não é necessário dizer que esta é apenas a parte da declaração - como qualquer outro ponteiro, você precisa atribuir um endereço a ele (o de uma função, neste caso) para utilizá-lo.

A seguir, um exemplo que utiliza este ponteiro:

#include   

void print_int(int a)  
{  
 printf("\n O valor inteiro é: %d\n",a);  
}  
  
int main()  
{  
 void (*fn_ptr)(int);  
 fn_ptr = &print_int;  
 (*fn_ptr)(10);  
  
 return 0;  
}

Como você pode ver, primeiro definimos uma função ‘print_int’ que aceita um inteiro e retorna void. Em seguida, na função ‘main’, declaramos ‘fn_ptr’ como um ponteiro de função que pode apontar para funções como ‘print_int’. Isso foi seguido pela atribuição do endereço da função ‘print_int’ a ‘fn_ptr’ e, finalmente, fazendo uma chamada para a função usando o ponteiro.

Aqui está a saída produzida:

O valor inteiro é: 10 

Vale a pena mencionar que você pode simplificar ainda mais este programa evitando & e * das duas últimas linhas. A seguir, o código modificado:

#include   

void print_int(int a)  
{  
 printf("\n O valor inteiro é: %d\n",a);  
}  
  
int main()  
{  
 void (*fn_ptr)(int);  
 fn_ptr = print_int;  
 fn_ptr(10);  
  
 return 0;  
} 

Seguindo em frente, assim como um array de ponteiros, você também pode ter um array de ponteiros de função. Por exemplo, a seguir está um array de ponteiros de função capaz de armazenar 3 endereços de função.

void (*fn_ptr[3])(int)

E a seguir está um exemplo que utiliza este array de ponteiros:

void print_int1(int a)  
{  
 printf("\n O valor inteiro é: %d\n",a);  
}  
  
void print_int2(int a)  
{  
 printf("\n O valor inteiro é: %d\n",a+1);  
}  
  
void print_int3(int a)  
{  
 printf("\n O valor inteiro é: %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;  
}

Aqui está a saída produzida por este código:

O valor inteiro é: 10   
   
O valor inteiro é: 11   
   
O valor inteiro é: 12

Outro aspecto dos ponteiros de função que você deve conhecer é que você pode usá-los como argumentos de função também. Por exemplo, pode haver uma função que aceita um ponteiro para uma função como argumento. Por exemplo:

void some_random_func(void (*fn_ptr)(int)) 

A seguir, um exemplo de código que utiliza esta função:

#include   

void another_random_func(int a)  
{  
 printf("\n O inteiro a ser inserido é: %d\n", a);  
}  
  
void some_random_func(void (*fn_ptr)(int))  
{  
 fn_ptr(5);  
}  
  
int main()  
{  
 some_random_func(another_random_func);  
 return 0;  
}

O que fizemos aqui foi criar uma função chamada ‘some_random_func’ que aceita um ponteiro de função como entrada. Então, a partir de ‘main’, chamamos ‘some_random_func’ com o endereço de outra função ‘another_random_func’ como argumento. Em seguida, usando o ponteiro, chamamos com sucesso ‘another_random_func’.

Aqui está a saída:

O inteiro a ser inserido é: 5 

Conclusão

Ponteiros de função podem ser úteis quando você deseja criar algo chamado ‘mecanismo de callback’ (leia mais sobre isso aqui). Mas antes de entrar nisso, é melhor que você tenha uma boa compreensão deste conceito. Sugerimos que você tente exemplos deste tutorial em sua máquina local (e também crie novos). Em caso de dúvida ou consulta, deixe um comentário abaixo.

Share: X/Twitter LinkedIn

Receba novas postagens na sua caixa de entrada

Sem spam. Cancele a assinatura a qualquer momento.