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

  1. Ponteiro para função
  2. Função como parâmetro e argumento
  3. Vetor de ponteiro para função
  4. ponteiro para função em struct
  5. matriz de ponteiro para função

Os assuntos vetor/matriz podem ser vistos em C: Vetor/Matriz, funções em C: Funções, ponteiros em C: Ponteiros: Introduçã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, podemos invocar funções de forma dinâmica.

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

Sintaxe
tipo_retorno (*nome_ponteiro)( <lista_tipos_parametros> );
Onde
tipo_retorno: tipo de retorno da função
nome_ponteiro: nome da variável ponteiro
*(): 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 da seguinte forma:

Sintaxe
nome_variavel = (*nome_ponteiro)( <lista_argumentos> ); //com retorno

(*nome_ponteiro)( <lista_argumentos> ); //sem retorno ou retorno descartado
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. Como podemos atribuir 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( <parametros_funcao> , tipo_retorno (*ponteiro_funcao( <tipos_parametros> ))
{
    (*ponteiro_funcao)(<argumentos>); //callback
}
Onde
tipo_retorno: tipo de retorno da função
<parametros_funcao>: lista de parâmetros para a função apontada por ponteiro_funcao
*ponteiro_funcao: nome do ponteiro para uma função callback
<tipos_parametros: lista de tipos dos parametros 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 para função. Com isso em mente, a declaração desse vetor pode ser feita como mostrado na sintaxe a seguir:

Sintaxe
tipo_retorno(*nome_vetor[<dimensao>])(<tipos_parametros>)
Onde
tipo_retorno: tipo de retorno da função.
<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

Dependendo do contexto da aplicação e como suas funções são chamadas, o uso de vetor de ponteiros pode substituir, de forma básica, o comando switch, eliminando as comparações em seus cases invocando assim um trecho de código mais rápido.

  1. 04/09/2025 - revisão 4 - Ajustes: pontuais, objetivos e sintaxes; Adição: parágrafo sobre comando 'switch'
  2. 11/03/2025 - revisão 3 - Correções pontuais
  3. 07/10/2024 - revisão 2 - Correção: link 'Anterior', sintaxes; melhorias pontuais
  4. 02/10/2023 - revisão 1 - Correção em referências, erros gramaticais
  5. 19/05/2023 - versão inicial