Определение именнованных констант
Существуют 3 вида именнованных констант:
- имя любого массива или функции;
- имена членов перечисления;
- любое имя любого типа, в определении которого присутствует модификаторconst.
const i = 5;
const char *ip = &i;
Поскольку модификация такого объекта-константы запрещена, он должен быть инициализирован.
const int *ip; //константой является объект, на который указывает указатель;
int* const ip; //сам указатель является константой
const char *pc = "Это строка";
pc[2] = 'a'; //ошибка
pc = "Это другая строка"; //верно
char* const pc = "Это строка";
pc[2] = 'a'; //верно
pc = "Это другая строка"; //ошибка
Использование const предпочтительнее по сравнению с #define, так как использование константы контролирует компилятор.
Перечисления
Спецификатор enumпозволяет программисту создавать собственные типы.
enum weekDays {Monday, Tuesday, Wensday, Thursday, Friday};
Идентификаторы перечисления представляют собой целочисленные переменные, которые по умолчанию имеют значения 0,1,..., если не указаны другие значения.
weekDays days;
Переменная days теперь может принимать одно из 5 значений.
days = Wensday;
Пример 2.
enum colors {Red=2, Green=3, Grey};
Если задано значение впереди стоящему члену перечисления, то Grey по умолчанию будет равен 4.
Пример 3.
enum VIDEO_BASE_ADDRES { VGA_EGA=0xA000000, CGA=0xB800000,
MONO=0xB000000};
Битовые поля
В некоторыя задачах для экономии памяти необходимо упаковывать несколько объектов в одно машинное слово. В Си для этого определяются поля и доступ к ним. Поле – это последовательность битов внутри одного целого значения.
struct { unsigned a:8;
unsigned b:6;
unsigned c:2;}d;
Определяем структуру d, содержащую поле а – 8 битов, поле b – 6 битов, с – 2 бита. Поля описываются как unsigned, чтобы подчеркнуть, что это величины без знака. Отдельные поля теперь обозначаются как d.a, d.b, d.c. С полями можно выполнять различные операции.
d.a= d.b=( d.c<<2)+6;
Поля не могут переходить за границу слова в ЭВМ. Если же очередное поле не помещается в частично заполненное слово, то под него выделяется новое слово. Поля могут быть безымянными. Используются как заполнители. Для принудительного перехода на новое слово используется специальный размер 0.
struct {unsigned a:8;
:2;
unsigned b:6;
:0;
unsigned c:12;} d;
Битовые поля и объединения можно применять для неявного преобразования типов.
Пример 1.
struct DOS_DATE { unsigned int day:5;
unsigned int month:4;
unsigned int year:7;};
union DATE_CONV { unsigned int packed_date;
struct DOS_DATE unpacked_date;};
typedef union DATE_CONV DATE
void main(void) {
struct ffblk ff; //структура в которую читается информация о
//файле из каталога, описана в <dir.h>
int done=findfirst(“*.*”, &ff,0); //ищет первый файл в каталоге
if(!done) {
DATE d;
d.packed_date=ff.ff_date;
printf(%2d/%2d/%4d”, d.unpacked_date.day, d.unpacked_date.month, d.unpacked_ date .year+1980);
}
}
Дата добавления: 2018-11-25; просмотров: 291;