Урок 8.4. Собственные имена типов

8.4. Собственные имена типов

Язык Си предоставляет возможность определять по усмотрению программиста
новые имена для любых типов данных. Для этого используется оператор определения
типа typedef, имеющий общий вид записи:

typedef _тип_
_новое_имя_типа_,...,_новое_имя_типа;

Например описание:

typedef int COUNT;

делает имя COUNT (прописные буквы используются только для
наглядности с целью зрительного выделения в программе нового имени типа)
синонимом типа int. Теперь можно использовать COUNT во всех описаниях, операциях преобразования
типов и в других случаях точно так же, как и ключевое слово int:

COUNT x,y; /* x,y переменные целого типа */

COUNT mas[10]; /* массив целых чисел */

Как видно из общей формы записи, одним оператором typedef можно определить более чем одно новое имя
типа, например, оператор:

typedef double VOLUME, WEIGHT;

вводит два новых
имени для типа double.

При определении новых имен типов для указателей и массивов новое имя
типа должно содержать, так называемый, абстрактный описатель. Абстрактный
описатель - это описатель без идентификатора. Для указателя абстрактным
описателем является знак * , а для массива пара знаков [] . C абстрактным
описателем указателя мы уже встречались, когда осуществляли преобразование
указателя на тип void к указателю на нужный нам тип данных. Например, при
использовании функции запроса памяти malloc можно записать выражение (int *)malloc(sizeof(int)), в котором операция преобразования типа использует
абстрактный описатель на указатель. С абстрактым описателем массива мы также
познакомились, когда в разделе 8.1.1 рассматривали примеры сложных описаний
указателей. Был приведен оператор описания указателя на пятиэлементный массив
символьных данных char (*pt)[5];, в
котором [5] является абстрактным описателем массива, ибо
он употреблен без имени массива, - pt не
имя массива, а указатель.

В операторе typedef, при
определении новых имен типов для указателей, знак * должен стоять перед новым
именем типа, а, при определении новых имен типов для массивов, знаки [] после имени нового типа. Например, если
имеется определение:

typedef char *STRING, FIO[40];

то STRING становится именем типа для char *, а FIO именем типа для одномерных массивов из сорока символов. Теперь, если
необходим указатель на символ и массив указателей, то их можно описать таким
образом:

STRING p,mp[5];

что эквивалентно
описанию:

char *p,*mp[5];

Описание:

FIOperson,*adr;

говорит о том, что person - массив символов, а adr - указатель на массив символов. Это эквивалентно
описанию:

char person[40],*adr;

 

Можно использовать typedef,
например, и для структур:

typedef struct RECORD {

int num;

char name[20];

float pmn;

} SR, *PSR;

порождает два новых
служебных слова для типов: SR -
структура и PSR - указатель на структуру типа RECORD. В этом случае оператор описания, например, SRw1;
определяет структурную переменную w1
типа RECORD, а описание PSRpw;
определяет указатель на структурную переменную. Одна из причин использования
оператора typedef заключается в создании удобных,
распознаваемых имен для часто встречающихся в программе типов данных. Другая
важная необходимость применения собственных имен типов связана с обеспечением
мобильности программ. В этом случае все описания данных делаются при помощи
собственных имен типов, а при изменении технической базы производятся только
корректировки соответствующих операторов typedef.

В заключение еще раз подчеркнем, что оператор typedef не создает никакого нового типа данных, - он
добавляет новое имя для некоторого существующего типа. Не вводится и новая
семантика: описанные таким способом данные имеют те же самые свойства, которыми
они обладали бы в случае явного развернутого описания.

рассказать друзьям и получить подарок

Оставить комментарий

Ваш email не будет опубликован. Обязательные поля отмечены *

Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Translate Переводчик

Подписка на новости

SmartResponder.ru
Ваш e-mail: *
Ваше имя: *

Хостинг для Wordpress сайтов