Определение структурных переменных
Структура объединяет логически связанные данные разных типов. Структурный тип данных определяется следующим описанием:
struct имя_структуры {
Описание_элементов
};
Пример:
struct dinner {
char *place;
float cost;
struct dinner *next;
};
Структурная переменная описывается с помощью переменной структурного типа.
Примеры:
struct dinner week_days [7]; /* массив структур */
struct dinner best_one; /* одна структурная переменная */
struct dinner *p; /* указатель на структурную переменную */
Структура, запись в терминологии языка Паскаль и Ада, - это составной объект, в который входят компоненты любых типов, за исключением функций. В отличие от массива, который является однородным объектом, структура может быть неоднородной. Типструктуры указывается записью вида
struct {
список описаний
} имя;
В структуре должен быть указан хотя бы один компонент. Указатель типа структуры используется для определения структур. Определения структур имеют следующий вид:
где тип-данных указывает тип структуры для объектов, определяемых в описателях. В своей простейшей форме описателипредставляют собой обычные имена переменных, массивов, указателей и функций. Например, с помощью определения
struct {
double x,y;
} a,b,c[9];
переменные a и b определяются как структуры, каждая из которых состоит из двух компонентов - x и y. Переменная cопределяется как массив из девяти таких структур.
Из определения
struct {
int year;
short int month, day;
} date1,date2;
следует, что каждая из двух переменных date1, date2 состоит из трех компонентов: year, month, day.
С типом структуры может быть ассоциировано имя, которое задается описанием типа в форме
typedef struct {
список описаний
} имя-типа-структуры;
Спецификатор typedef (определяет класс памяти) позволяет нам создать свое собственное имя типа. Это напоминает директиву#define, но со следующими тремя изменениями:
- В отличие от #define спецификатор typedef дает символические имена, но ограничивается только типами данных.
- Спецификатор typedef выполняется компилятором, а не препроцессором.
- В своих пределах спецификатор typedef более гибок, чем #define.
В дальнейшем эти имена могут использоваться для определения структур. Ниже приведен пример описания типа структуры с именем employee:
typedef struct {
char name[30];
int id;
dept d;
family f;
} employee;
где слова dept, family указывают типы, а именно типы структур, предварительно определенные пользователем. Тип структурыemployee может быть использован для определения переменных. Например, определение
employee chairperson, president, e1, e2;
описывает переменные chairperson, president, e1, e2 как структуры типа employee.
Существует и другой способ ассоциирования имени с типом структуры. Этот способ основан на применении меток структуры. Метки структуры аналогичны меткам перечисляемого типа. Метка структуры описывается следующим образом:
struct метка{
список описаний
}
где метка является идентификатором. В приведенном ниже примере слово student описывается как метка структуры:
struct student {
char name[25];
int id,age;
char sex;
};
Метки структуры используются для определения структур записью вида
struct метка список-идентификаторов;
Использование меток структуры необходимо для описания рекурсивных структур, так как одного только оператора typedefнедостаточно. В приведенном ниже примере описания рекурсивной метки структуры
struct node {
int data;
struct node *next;
};
метка структуры node действительно является рекурсивной, так как она используется в своем собственном описании, т.е. в описании указателя next. Из-за наличия знака * переменная next описана как указатель на объекты типа node. Структуры не могут быть прямо рекурсивными. Структура типа S не может содержать компонент, являющийся структурой типа S. Однакоструктура типа S может содержать компонент, указывающий на структуру типа S.
Доступ к компонентам структуры
Такой доступ осуществляется с помощью специального обозначения для выделенного компонента, имеющего следующий вид:
где s является именем структуры или значением структуры с компонентом c. s может быть выражением, дающим в результатезначение структуры. Например, s может быть вызовом функции со структурой в качестве ее значения. К компонентам определенной выше структуры date1 можно обратиться, указав их обозначения:
date1.year
date1.month
date1.day
Поля битов в структурах
Поле битов - это элемент структуры, определенный как некоторое число бит, обычно меньшее, чем число бит в целом числе. Поля битов предназначены для экономного размещения в памяти данных небольшого диапазона.
Пример:
struct bfeg {
unsigned int bf_flg1 : 10;
unsigned int bf_flg2 : 6;
};
Данная структура описывает 10-битовое поле, которое для вычислений преобразуется в значение типа unsigned int, и 6-битовоеполе, которое обрабатывается как значение типа unsigned int.
Объединения
Объединение описывает переменную, которая может иметь любой тип из некоторого множества типов.
Определение объединенного типа данных аналогично определению структурного типа данных:
union имя_объединения {
Описания_элементов
};
Пример:
union bigword {
long bg_long;
char *bg_char [4];
};
Данные типа union bigword занимают память, необходимую для размещения наибольшего из своих элементов, и выравниваются в памяти к границе, удовлетворяющей ограничениям по адресации как для типа long, так и для типа char *[4].
Описание переменной объединенного типа:
Пример:
union bigword x;
union bigword *p;
union bigword a[100];
Перечисления
Данные перечислимого типа относятся к некоторому ограниченному множеству данных.
Определение перечислимого типа данных:
enum имя_перечислимого_типа {
Список_значений
};
Каждое значение данного перечислимого типа задается идентификатором.
Пример:
enum color {
red, green, yellow
};
Описание переменной перечислимого типа:
enum color chair;
enum color suite [40];
Использование переменной перечислимого типа в выражении.
Пример:
chair = red;
suite[5] != yellow;
|