typedef
est une construction de langage qui associe un nom à un type.
Vous l'utilisez de la même manière que vous utiliseriez le type d'origine, par exemple
typedef int myinteger;
typedef char *mystring;
typedef void (*myfunc)();
les utiliser comme
myinteger i; // is equivalent to int i;
mystring s; // is the same as char *s;
myfunc f; // compile equally as void (*f)();
Comme vous pouvez le voir, vous pouvez simplement remplacer le nom typé par sa définition donnée ci-dessus.
La difficulté réside dans le pointeur vers la syntaxe des fonctions et la lisibilité en C et C ++, et typedef
peut améliorer la lisibilité de ces déclarations. Cependant, la syntaxe est appropriée, car les fonctions - contrairement à d'autres types plus simples - peuvent avoir une valeur de retour et des paramètres, d'où la déclaration parfois longue et complexe d'un pointeur vers la fonction.
La lisibilité peut commencer à être vraiment délicate avec des pointeurs vers des tableaux de fonctions, et quelques autres saveurs encore plus indirectes.
Pour répondre à vos trois questions
Pourquoi typedef est-il utilisé?
Pour faciliter la lecture du code - en particulier pour les pointeurs vers des fonctions ou des noms de structure.
La syntaxe semble étrange (dans le pointeur vers la déclaration de fonction)
Cette syntaxe n'est pas évidente à lire, du moins au début. L'utilisation d'une typedef
déclaration facilite la lecture
Un pointeur de fonction est-il créé pour stocker l'adresse mémoire d'une fonction?
Oui, un pointeur de fonction stocke l'adresse d'une fonction. Cela n'a rien à voir avec la typedef
construction qui facilite seulement l'écriture / lecture d'un programme; le compilateur développe simplement la définition de typedef avant de compiler le code réel.
Exemple:
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