Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпоры по ямп.docx
Скачиваний:
4
Добавлен:
01.04.2025
Размер:
161.76 Кб
Скачать

10.Перечислимый тип. Структуры. Объединения.

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

Перечислимый тип задаёт тип, который является подмножеством целого типа.

Объявление переменной перечислимого типа задаёт имя переменной и определяет список именованных констант, называемый списком перечисления:

enum [<тег>] {<список перечисления>} <описатель> [, <описатель> ...];

enum <тег> <описатель> [, <описатель> ...];

Тег предназначен для различения нескольких перечислимых типов, объявленных в одной программе.

Список перечисления содержит одну или более конструкций вида:

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

Конструкции в списке разделяются запятыми. Каждый идентификатор именует элемент списка перечисления. По умолчанию, если не задано константное выражение, первому элементу присваивается значение 0, следующему элементу – значение 1 и т.д.

Запись = <константное выражение> изменяет умалчиваемую последовательность значений. Элемент, идентификатор которого предшествует записи = <константное выражение>, принимает значение, задаваемое этим константным выражением. Константное выражение должно иметь тип int и может быть как положительным, так и отрицательным. Следующий элемент списка получает значение, равное<константное выражение> + 1, если только его значение не задаётся явно другим константным выражением.

В списке перечисления могут содержаться элементы, которым сопоставлены одинаковые значения, однако каждый идентификатор в списке должен быть уникальным. Кроме того, идентификатор элемента списка перечисления должен быть отличным от идентификаторов элементов всех остальных списков перечислений, а также от других идентификаторов.

2. Структуры

Структура позволяет объединить в одном объекте совокупность значений, которые могут иметь различные типы. Однако в языке С реализован очень ограниченный набор операций над структурами как единым целым: передача функции в качестве аргумента, возврат в качестве значения функции, получение адреса. Можно присваивать одну структуру другой, если они имеют одинаковый тип.

Объявление структуры задает имя структурного типа и/или последовательность объявлений переменных, называемых элементами структуры. Эти элементы могут иметь различные типы.

struct [<тег>] {<список объявлений элементов>} <описатель> [, <описатель> ...];

struct <тег> <описатель> [, <описатель> ...];

Тег предназначен для различения нескольких структур, объявленных в одной программе.

Список объявлений элементов представляет собой последовательность из одного или более объявлений переменных. Каждая переменная, объявленная в этом списке, называется элементом структуры. Особенность синтаксиса объявлений элементов структуры состоит в том, что они не могут содержать спецификаций класса памяти и инициализаторов. Элементы структуры могут иметь базовый тип, либо быть массивом, указателем,объединением или структурой.

Элемент структуры не может быть структурой того же типа, в которой он содержится. Однако он может быть указателем на тип структуры, в которую он входит. Размер указателя стандартный, поэтому компилятор знает, сколько памяти потребуется под указатель. Для работы с указателем надо знать размер типа, на который он указывает, но к моменту работы с указателем структура будет полностью объявлена, и, следовательно, размер её будет известен.

Идентификаторы элементов структуры должны различаться между собой. Идентификаторы элементов разных структур могут совпадать.

Для инициализации структуры, как и других составных типов, надо записать список инициализаторов через запятую в фигурных скобках.

Выбор элемента структуры осуществляется с помощью одной из следующих конструкций:

<переменная> . <идентификатор элемента структуры>

<указатель> -> <идентификатор элемента структуры>

Выражение выбора элемента позволяет получить доступ к элементу структуры. Выражение имеет значение и тип выбранного элемента.

Две структуры являются разными типами, даже если их объявления полностью совпадают.

Объединения

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

union [<тег>] {<список объявлений элементов>} <описатель> [, <описатель> ...];

union <тег> <описатель> [, <описатель> ...];

Тег предназначен для различения нескольких объединений, объявленных в одной программе.

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

12.Время жизни и область действия.

Время жизни переменной может быть глобальным и локальным. Переменная с глобальным временем жизни характеризуется тем, что в течение всего времени выполнения программы с ней ассоциирована ячейка памяти и значение. Переменной с локальным временем жизни выделяется новая ячейка памяти при каждом входе в блок, в котором она определена или объявлена. Время жизни функции всегда глобально.

Область видимости объекта (переменной или функции) определяет, в каких участках программы допустимо использование имени этого объекта.

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

int x = x;

// Странно!

Это допустимо, но не разумно.

Прежде чем имя может быть использовано в программе на C++, оно должно быть объявлено (иметьобъявление), т.е. должен быть указан тип имени, чтобы компилятор знал, на сущность какого вида ссылается имя. Определение не только связывает тип с именем, но и определяет некоторую сущность, которая соответствует имени. В программе на C++ для каждого имени должно быть ровно одно определение. Объявлений же может быть несколько. Все объявления некой сущности должны согласовываться по типу этой сущности.

int count;

int count;

// Ошибка – повторное определение

extern int error_number;

extern short error_number;

// Ошибка – несоответствие типов объявлений

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