Определение типа данных (спецификатор typedef)
Спецификатор typedef позволяет в явном виде определить производный тип данных и использовать его имя в программе как обозначение этого типа, аналогично базовым ( int, char ...). В этом смысле он похож на определение структуры, в котором имя структуры (со служебным словом struct ) становится идентификатором структурированного типа данных. Спецификатор typedef позволяет сделать то же самое для любого типа данных.
Спецификатор typedef имеет синтаксис контекстного определения типа данных, в котором вместо имени переменной присутствует имя вводимого типа данных. Рассмотрим пример:
// Синтаксис контекстного определения типа для переменной PSTR
typedef char *PSTR; // PSTR - имя производного типа данных.
Тип данных PSTR определяется в контексте как указатель на символ (строку).
PSTR p,q[20],*pp;
Переменная p типа PSTR, массив из 20 переменных типа PSTR и указатель типа PSTR представляют собой указатель на строку, массив указателей на строку и указатель на указатель на строку.
long l;
*((PSTR)&l + 2) = 5;
Указатель на переменную типа long преобразуется к типу указатель на строку.
В принципе, использование оператора typedef характеризует скорее стиль программирования, нежели насущную необходимость. Дело в том, что один и тот же тип данных в Си может использоваться для работы с различными структурами данных (особенно это касается указателей). Например, тип char* может использоваться для обозначения:
-указателя на отдельный символ (адрес символа);
-указателя на массив символов (строку);
-указателя на область байтов (начальный адрес).
С помощью typedef программистами могут устанавливать соглашения по обозначению тех или иных типов и связанных с ними структур данных. Например, тип PSTR используется для обозначения указателя на строку символов, заканчивающуюся символом '\0'. Заметим, что в этом случае никаких дополнительных действий по проверке корректности структур данных транслятором не производится: тип данных PSTR только улучшает читаемость программы.