typedef
это языковая конструкция, которая связывает имя с типом.
Вы используете его так же, как вы использовали бы, например, оригинальный тип
typedef int myinteger;
typedef char *mystring;
typedef void (*myfunc)();
используя их как
myinteger i; // is equivalent to int i;
mystring s; // is the same as char *s;
myfunc f; // compile equally as void (*f)();
Как видите, вы можете просто заменить имя typedefed определением, приведенным выше.
Сложность заключается в указателе на синтаксис функций и читаемость в C и C ++, и они typedef
могут улучшить читаемость таких объявлений. Однако синтаксис является подходящим, поскольку функции - в отличие от других более простых типов - могут иметь возвращаемое значение и параметры, таким образом, иногда длинное и сложное объявление указателя на функцию.
Читаемость может стать очень сложной с указателями на массивы функций и некоторые другие, даже более косвенные варианты.
Чтобы ответить на ваши три вопроса
Почему используется typedef?
Для облегчения чтения кода - особенно для указателей на функции или структурные имена.
Синтаксис выглядит странно (в указателе на объявление функции)
Этот синтаксис не очевиден для чтения, по крайней мере, в начале. Использование typedef
декларации вместо этого облегчает чтение
Создан ли указатель на функцию для хранения адреса памяти функции?
Да, указатель функции хранит адрес функции. Это не имеет ничего общего с typedef
конструкцией, которая только облегчает написание / чтение программы; компилятор просто расширяет определение typedef перед компиляцией фактического кода.
Пример:
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