typedef
es una construcción de lenguaje que asocia un nombre a un tipo.
Lo usa de la misma manera que usaría el tipo original, por ejemplo
typedef int myinteger;
typedef char *mystring;
typedef void (*myfunc)();
usándolos como
myinteger i; // is equivalent to int i;
mystring s; // is the same as char *s;
myfunc f; // compile equally as void (*f)();
Como puede ver, podría reemplazar el nombre typedefed con su definición dada anteriormente.
La dificultad radica en el puntero a las funciones de sintaxis y legibilidad en C y C ++, y typedef
puede mejorar la legibilidad de tales declaraciones. Sin embargo, la sintaxis es apropiada, ya que las funciones, a diferencia de otros tipos más simples, pueden tener un valor de retorno y parámetros, por lo tanto, la declaración a veces larga y compleja de un puntero para funcionar.
La legibilidad puede comenzar a ser realmente complicada con punteros a matrices de funciones y algunos otros sabores aún más indirectos.
Para contestar tus tres preguntas
¿Por qué se usa typedef?
Para facilitar la lectura del código, especialmente para punteros a funciones o nombres de estructura.
La sintaxis parece extraña (en el puntero a la declaración de la función)
Esa sintaxis no es obvia de leer, al menos al comenzar. Usar una typedef
declaración en su lugar facilita la lectura
¿Se ha creado un puntero de función para almacenar la dirección de memoria de una función?
Sí, un puntero de función almacena la dirección de una función. Esto no tiene nada que ver con la typedef
construcción que solo facilita la escritura / lectura de un programa; el compilador solo expande la definición typedef antes de compilar el código real.
Ejemplo:
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