Bacagine
(usa Arch Linux)
Enviado em 09/03/2026 - 11:47h
Sou desenvolvedor C há 7 anos, e em todos esses anos, duas maneiras de usar ponteiros me chamaram atenção.
Os conceitos a seguir são avançados, algumas coisas que vou falar não são abordadas muito em livros ou em cursos por aí, então não se preocupe se tiver dificuldades em entender.
1) Ponteiros Genéricos (void*)
Os ponteiros genéricos (void pointers) são usados quando você não sabe qual tipo de dado vai ser usado. Imagine que você cria uma estrutura de lista, e ao invés de definir qual dado será salvo na lista, você cria uma lista com ponteiro genérico, assim ela passa a aceitar qualquer tipo de dado.
typedef struct STRUCT_GENERIC_LIST {
void* pData;
struct STRUCT_GENERIC_LIST* pstNext;
} STRUCT_GENERIC_LIST, *STRUCT_GENERIC_LIST;
2) Callbacks (ponteiros para funções)
Esse é um dos usos que eu mais vejo no dia a dia, trabalhando como desenvolvedor C na empresa onde estou.
Imagine que você está desenvolvendo uma biblioteca que tem uma função que precisa chamar outra, porém você não sabe o conteúdo dessa função que você vai chamar, você não tem essa função no seu código, a única coisa que você sabe é a assinatura que essa função tem. Nesse caso, você cria uma callback, um ponteiro para a função, assim quando um desenvolvedor usar sua biblioteca, ele irá passar a função como parâmetro para este ponteiro.
Veja um exemplo a seguir:
typedef int (*PFNCALLBACK)(void);
void vMyFunction(PFNCALLBACK pfnCallback);
1) Criamos um tipo de dado que é um ponteiro de função chamado PFNCALLBACK.
2) Criamos uma função que recebe como parâmetro uma função com a assinatura de PFNCALLBACK, ou seja, uma função que retorna um inteiro e não recebe parâmetros.
O desenvolvedor que for chamar a função vMyFunction terá que passar como parâmetro uma função que tenha essa assinatura. Exemplo:
int iHelloWorld(void) {
puts("Hello World!!!");
puts("I'm a callback :)");
return 1;
}
int main(void) {
vMyFunction(iHelloWorld);
return 0;
}