Clique sobre os tópicos listados abaixo para navegar até o conteúdo desejado.

  1. Entender ponteiro para função
  2. Entender utilizar ponteiro de função como argumentos/parâmetro
  3. Entender criar vetores de ponteiro para função
  4. pointeiro para função em struct
  5. matriz de pointeiro para função

Como ponteiro trabalha com endereço de memória, a linguagem C nos permite a utilização do tipo ponteiro para referenciar nossas funções. Assim, temos o recurso de invocar funções dinamicamente.

Abaixo, a forma para declarar um ponteiro para um função:

Sintaxe
tipo_retorno (*nome_ponteiro)(tipos_parametros);
Onde
tipo_retorno: tipo de retorno da função.
nome_funcao: nome da função desejada.
*(): indica que vamos utilizar um ponteiro para função.

A atribuição de uma função a um ponteiro, é feita de forma semelhante a variáveis de outros tipos de dados vistos. Utilizamos também o operador "&":

Sintaxe
nome_ponteiro = &nome_funcao;

A chamada ou invocação da função, via ponteiro, é feita utilizando um ponteiro da seguinte forma:

Sintaxe
nome_variavel = (*nome_ponteiro)(lista_argumentos); //Retorno
(*nome_ponteiro)(lista_argumentos);
Exemplo 1
#include <stdio.h>
void funcao(int valor)
{
    printf("%d\n", valor);
}
int main()
{
    void (*pnt_funcao)(int) = NULL; //declaração
    pnt_funcao= &funcao; //atribuição
    (*pnt_funcao)(10); //chamada;
    return 0;
}
Saída
10

A compreensão do uso de ponteiro para função, nos permite aumentar nossas possibilidades. Da mesma forma que podemos associar uma função a um ponteiro, também podemos passar uma função como argumento de uma outra função.

Assim, definimos uma função callback, que pode ser utilizada para customizar o processamento dos dados trabalhados em uma função.

Sintaxe
tipo_retorno nome_funcao(lista_parametros, tipo_retorno (*nome_ponteiro(lista_tipos_parametros))
{
    (*callback)(argumentos);
}
Onde
tipo_retorno: tipo de retorno da função
*nome_ponteiro: nome do ponteiro para uma função callback
lista_tipos_parametros: lista de tipos separados por (,)
Exemplo 2
#include <stdio.h>

void impressao_decimal(int valor)
{
    printf("Valor em decimal: %d\n", valor);
}
void impressao_hexa(int valor)
{
    printf("Valor em hexa: %X\n", valor);
}
void impresssao(int valor, void (*pnt_funcao)(int) )
{
    (*pnt_funcao)(valor);
}
int main()
{
    impresssao(10,impressao_decimal);
    impresssao(10,impressao_hexa);
    return 0;
}
Saída
Valor em decimal: 10
Valor em hexa: A

Como ponteiro é um tipo de dados que guarda referências, podemos criar um vetor de ponteiros. Com isso em mente, a declaração de um vetor de ponteiros para funções pode ser feita como mostrado na sintaxe a seguir:

Sintaxe
tipo_retorno (*nome_vetor[dimensao])(lista_tipos_parametros)
Onde
tipo_retorno: tipo de retorno da função.
nome_funcao: nome da função desejada.
lista_tipos_parametros: lista de tipos separados por (,)
Exemplo 3
#include <stdio.h>

void funcao1(int valor)
{
    printf("Valor inteiro %dd\n", valor);
}
void funcao2(int valor)
{
    printf("Valor em hexadecimal %xh\n", valor);
}
void funcao3(int valor)
{
    printf("Valor em octal %oo\n", valor);
}
int main()
{
    void (*pnt_funcao[3])(int) = {NULL,NULL,NULL}; //declaração
    
    pnt_funcao[0] = &funcao1; //atribuição
    pnt_funcao[1] = &funcao2;
    pnt_funcao[2] = &funcao3;
    
    (*pnt_funcao[0])(16);//chamada
    (*pnt_funcao[1])(16);
    (*pnt_funcao[2])(16);
    
    return 0;
}
Saída
Valor inteiro 16d
Valor em hexadecimal 10h
Valor em octal 20o
  1. 11/03/2025 - revisão 3 - Correções pontuais
  2. 07/10/2024 - revisão 2 - Correção: link 'Anterior', sintaxes; melhorias pontuais
  3. 02/10/2023 - revisão 1 - Correção em referências, erros gramaticais
  4. 19/05/2023 - versão inicial