typedef
é uma construção de linguagem que associa um nome a um tipo.
Você o usa da mesma maneira que usaria o tipo original, por exemplo
typedef int myinteger;
typedef char *mystring;
typedef void (*myfunc)();
usando-os como
myinteger i; // is equivalent to int i;
mystring s; // is the same as char *s;
myfunc f; // compile equally as void (*f)();
Como você pode ver, você pode substituir o nome do tipo de digitação pela sua definição acima.
A dificuldade está no ponteiro para funções sintaxe e legibilidade em C e C ++, e isso typedef
pode melhorar a legibilidade de tais declarações. No entanto, a sintaxe é apropriada, pois as funções - diferentemente de outros tipos mais simples - podem ter um valor e parâmetros de retorno, portanto a declaração às vezes longa e complexa de um ponteiro para funcionar.
A legibilidade pode começar a ser realmente complicada com ponteiros para matrizes de funções e alguns outros sabores ainda mais indiretos.
Para responder suas três perguntas
Por que o typedef é usado?
Facilitar a leitura do código - especialmente para ponteiros para funções ou nomes de estrutura.
A sintaxe parece estranha (no ponteiro para a declaração de função)
Essa sintaxe não é óbvia para leitura, pelo menos no início. Usar uma typedef
declaração facilita a leitura
Um ponteiro de função é criado para armazenar o endereço de memória de uma função?
Sim, um ponteiro de função armazena o endereço de uma função. Isso não tem nada a ver com o typedef
construto que apenas facilita a escrita / leitura de um programa; o compilador apenas expande a definição de typedef antes de compilar o código real.
Exemplo:
typedef int (*t_somefunc)(int,int);
int product(int u, int v) {
return u*v;
}
t_somefunc afunc = &product;
...
int x2 = (*afunc)(123, 456); // call product() to calculate 123*456