
- •Введение в системное программирование Основные понятия и определения Программы и программное обеспечение
- •Системное программирование
- •Этапы подготовки программы
- •Системное программирование
- •Лекция 1
- •1. Язык Си: Общая характеристика, историческая справкаи основные достоинства
- •2. Подготовка к выполнению и выполнение программ
- •3. Элементы языка с
- •Лекция 2
- •1. Понятие типа данных. Переменные и константы. Операция присваивания
- •2.Типы данных в языке си. Описание данных в программе
- •3. Константы в языке Си
- •4. Арифметические операции и арифметические выражения
- •5. Операции отношения, логические операции и логические выражения
- •6. Автоматическое преобразрвание типов и операция приведения
- •7. Простейшие операторы языка си. Составной оператор
- •Лекция 3
- •3. Инициализация переменных и массивов
- •4. Управляющие конструкции языка си
- •Лекция 4
- •1. Адреса и указатели
- •2. Отождествление массивов и указателей.Адресная арифметика
- •3. Указатели на массивы. Массивы указателей и многомерные массивы
- •4. Динамическое выделение памяти под массивы
- •5. Инициализация указателей
- •Лекция 5
- •1. Функции в языке си. Формальные и фактические параметры. Механизм передачи параметров. Возвращаемые значения
- •2. Использование указателей в качестве аргументов функций
- •3. Предварительное описание функций
- •4. Аргументы командной строки
- •Лекция 6
- •1. Ввод и вывод в языке си: Общие концепции
- •2. Файлы данных и каталоги. Внутренняя организация и типы файлов
- •3. Стандартные функции для работы с файлами и каталогами
- •4. Внешние устройства как специальные файлы. Организация обмена со стандартными внешними устройствами
- •5. Операции ввода/вывода через порты микропроцессоров intel 8086/80286
- •Лекция 7
- •1. Общая структура программы на языке си. Время существования и видимость переменных. Блоки
- •2. Классы памяти
- •3. Рекурсивные вызовы функций. Реализация рекурсивных алгоритмов
- •4. Препроцессор языка Си
- •5. Модели памяти, поддерживаемые компилятором ibm c/2
- •Лекция 8
- •1. Структуры в языке си: основные понятия
- •2. Массивы структур
- •3. Указатели на структуры
- •4. Вложение структур
- •5. Структуры и функции
- •6. Объединения
- •7. Перечисления
- •8. Определение и использование новых типов данных
- •9. Классы имен
6. Объединения
Объединение - это средство, позволяющее размещать данные различных типов в одном и том же месте оперативной памяти. С точки зрения грамматики языка Си, всякое объединение является переменной, принимающей в различное время выполнения программы значения различных типов. Описания объединений имеют тот же самый формат, что и описания структур и в общем случае задаются одной из следующих схем:
union <tag> { member-declaration list } <declarator <, ... >>;
или
union tag declarator <, declarator ... >;
Здесь union есть ключевое слово языка Си, а остальные обозначения использованы в смысле своих прежних значений. Declarator чаще всего является идентификатором переменной, возможно модифицированным с помощью квадратных скобок (для массивов объединений) или символа звездочка (для указателей на объединения). Память, выделяемая под объединения, определяется длиной наибольшего элемента в составе данного объединения. При этом все члены объединения хранятся в одной и той же области памяти с неизменным начальным адресом. Для иллюстрации использования объединений рассмотрим пример организации данных, обеспечивающих доступ к рабочим регистрам микропроцессоров Intel 8086/80286.
union REGS { struct { unsigned int ax;
unsigned int bx;
unsigned int cx;
unsigned int dx; } x;
struct { unsigned char al, ah;
unsigned char bl, bh;
unsigned char cl, ch;
unsigned char dl, dh; } h;
} regs;
Здесь элементы внутренних структур x и h размещены в одной и той же области памяти, в которую будет пересылаться содержимое рабочих регистров (скажем, при помощи программы, написанной на языке ассемблера). При этом обращение вида
regs.x.ax
моделирует доступ к регистру AX микропроцессора, а выражения
regs.h.al и regs.h.ah
обеспечивают соответственно доступ к младшему AL и старшему AH байтам этого регистра.
7. Перечисления
Тип данных перечисление позволяет определить набор символических имен, связав с каждым из них числовое значение целого типа. Как и при определении структур, допустимыми являются две общие формы составления описаний:
enum <tag> { enum-list } <identifier <, identifier ... >>;
или
enum tag identifier <, identifier ... >;
Здесь enum есть ключевое слово языка Си, а под enum-list понимается список разделенных запятыми идентификаторов и необязательных выражений константного типа:
identifier <= cjnstant-expression>
Каждый идентификатор в этом списке именует один элемент из множества перечисляемых значений. По умолчанию первый из них получает значение нуль, второй - значение единица и т. д. Опция
= constant-expression
входящая в enum-list, позволяет нарушить стандартное правило назначения числовых значений именам из этого списка, причем константное выражение constant-expression должно иметь тип int. Допустимым также является совпадение числовых значений различных имен в списке. Теги перечислений определяются по тем же самым правилам, что и теги структур и объединений, и могут быть использованы в сокращенной форме описания, замещая enum-list. В следующем примере определяется перечисление с именем day и объявляется переменная workday, имеющая тип перечисление:
enum day { saturday,
sunday = 0,
monday,
tuesday,
wednesday,
thursday,
friday } workday;
Значение нуль связывается с идентификатором saturday по умолчанию, а идентификатору sunday оно же присваивается явным образом. Остальные пять имен в этом списке последовательно получают значения от 1 до 5.