typedef
is a language construct that associates a name to a type.
You use it the same way you would use the original type, for instance
typedef int myinteger; typedef char *mystring; typedef void (*myfunc)();
using them like
myinteger i; // is equivalent to int i; mystring s; // is the same as char *s; myfunc f; // compile equally as void (*f)();
As you can see, you could just replace the typedefed name with its definition given above.
The difficulty lies in the pointer to functions syntax and readability in C and C++, and the typedef
can improve the readability of such declarations. However, the syntax is appropriate, since functions – unlike other simpler types – may have a return value and parameters, thus the sometimes lengthy and complex declaration of a pointer to function.
The readability may start to be really tricky with pointers to functions arrays, and some other even more indirect flavors.
To answer your three questions
- Why is typedef used? To ease the reading of the code – especially for pointers to functions, or structure names.
- The syntax looks odd (in the pointer to function declaration) That syntax is not obvious to read, at least when beginning. Using a
typedef
declaration instead eases the reading - Is a function pointer created to store the memory address of a function? Yes, a function pointer stores the address of a function. This has nothing to do with the
typedef
construct which only ease the writing/reading of a program ; the compiler just expands the typedef definition before compiling the actual code.
Example:
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