Направления программирования. История создания языка Си. Особенности языка, страница 14

Замечание: В Си++ не обязательно указывать ключевое слово struct.

Описание stud – это только абстракция, т.к. в памяти компьютера место под name и age выделено не будет. Структура stud показывает, как строить объекты r1, r2 в памяти компьютера. Например, в ПЭВМ любой из объектов r1, r2 будет занимать 22 байта(20 байт для массива name и 2 байта для переменной age). Объекты r1, r2 – это уже не абстракция, а реальность, существующая в пространстве (памяти компьютера) и во времени (в каждый момент времени они могут получать определенные значения). Объекты r1, r2 – это статические переменные (компилятор резервирует для них память, которая остается занятой до конца программы), которые могут только получать определенные значения.

Доступ к элементу структуры организуется с помощью уточненного имени.

1)  <имя объекта (переменная типа структура)>.<идентификатор поля структуры>

2)  <указатель на структуру>à <имя поля>

Пример:    r1.name

п.9.3.Объединение.

Объединение имеет тот же синтаксис, что и структуры:

union[<идентификатор типа>]{<список полей>}<идентификатор>[ ,<идентификатор>]

Объединение в отличии от структуры позволяет размещать в одной и той же области памяти данные различных типов. В каждый момент времени в памяти может быть размещено значение только одного, включенного в объединение типа. Размер памяти, требуемый для размещения объединения, определяется размером наибольшего поля.

Для создания эквивалента записи с вариантами можно использовать объединение внутри структур. Для этого в структуру включают поле, позволяющее узнавать, какое из полей объединения активно в каждом конкретном случае. Другого способа определить, какое из полей активно не существует.

Объявление Typedef.

Синтаксис объявления:

tipedef<спецификация типа> <имя типа>

Пример:

1)  typedef unsigned char byte;

byte i, j;

2)  typedef struct

{

char name[20];

int age;

}stud;

stud st;

После объявления tipedef имя типа и спецификация типа становятся синонимами и могут быть использованы в последующих объявлениях переменных.

Перечислимый тип.

Синтаксис объявления:

1)  enum[<имя типа>]{<список перечислений>}<идентификатор пер.>[ ,<идентификатор пер.>]

2)  enum<имя типа><идентификатор пер.>[ ,<идентификатор пер.>]

Во втором случае с помощью <имени типа> мы ссылаемся на перечислимый тип, объявленный раньше. Список перечислений – набор имен констант.

<идентификатор>[=<константное выражение>]

Если константное выражение не заданно, то первый элемент получает значение 0, второй – 1 и т. д.. Знак =<константное выражение> прерывает эту последовательность. Следующий элемент, если не заданно константное выражение, принимает значение <константное выражение>+1, причем предыдущий элемент должен принять значение <константное выражение>. В списке перечислений могут быть объявлены элементы, которым сопоставляются одинаковые значения, но каждый идентификатор должен быть уникальным.

Элементы списка имеют тип int, поэтому над объектами перечислимого типа определены те же операции, что и над типом int (присваивание (=), сравнение (¹), арифметические операции).

1)  enum  color{white, black, blue, green}col;

0         1        2        3

2)  enum  color{white, black=5, blue=6, green=2, red=5}col;

Основная причина использования перечислимого типа – это улучшение читаемости программы.

Замечание: В Си и Си++ по – разному обрабатываются перечислимые типы. Язык Си считает перечислимые типы, эквивалентом целых типов, допуская присвоение величины одного типа, величине другого. Си++ считает перечислимые типы особыми пользовательскими типами, требующими явного преобразования типа.

Замечание:  Если вы объявляете переменную Си перечислимого типа, надо указывать ключевое слово enum вместе с именем типа. В Си++ можно просто указывать имя типа.