
- •Федеральное агентство по образованию
- •Краткая история языка с
- •Особенности и основные понятия языка Си
- •Структура программы
- •Типы данных
- •Классификация типов данных
- •Вещественные
- •Логический
- •Диапазоны представления данных
- •Объявление переменных
- •Константы в языке Си
- •Операции языка Си. Приоритет операций
- •Операция присваивания
- •Арифметические операции
- •Операции отношения
- •Логические операции
- •Поразрядные операции
- •Операцияsizeof
- •Операция выбора по условию
- •Операция запятая
- •Приведение типов Неявное преобразование типов
- •Явное преобразование типов
- •Основные средства ввода-вывода на Си Понятие потока
- •Стандартные потоки
- •Функции потокового ввода-вывода
- •Функции ввода
- •Ввод символов
- •Ввод строк
- •Форматированный ввод
- •Операторы языка Си
- •Оператор if
- •Оператор switch
- •Оператор while
- •Оператор do while
- •Оператор for
- •Оператор break
- •Оператор continue
- •Функции вывода на экран
- •Вывод символов
- •Функция вывода строк puts()
- •Форматированный вывод
- •Указатели в языке Си
- •Адресная арифметика
- •Массивы
- •Функции в языке с
- •Прототипы функций
- •Указатели типа void
- •Функции, возвращающие указатели
- •Встраиваемые функции
- •Рекурсивные функции
- •Функции с переменным числом аргументов
- •Аргументы функции main()
- •Область действия и область видимости
- •Локальные переменные
- •Локальные переменные в функции Main()
- •Глобальные переменные
- •Классы памяти
- •Указатели на указатели
- •Указатели и многомерные массивы
- •Массивы указателей
- •Указатели на функции
- •Операции над строками символов Определение длины строки
- •Копирование строк
- •Поиск в строках
- •Преобразования символов в строках
- •Другие функции для работы со строками
- •Преобразования строк в числа
- •Преобразования чисел в строки
- •Функции анализа символов
- •Распределение памяти
- •Манипулирование блоками памяти
- •Типы, определяемые пользователем
- •Перечислимый тип
- •Структуры
- •Сложные структуры
- •Битовые поля в структурах
- •Объединения
- •Работа с файлами Связь между потоками и файлами
- •Типы дисковых файлов
- •Открытие файла
- •Запись и чтение данных
- •Форматированный ввод-вывод Форматированный вывод
- •Int fprintf (file *fp, char *fmt, ...);
- •Форматированный ввод
- •Символьный ввод
- •Символьный вывод
- •Блочный ввод-вывод
- •Закрытие файла
- •Директивы препроцессора
- •Директива #include
- •Директива #define
- •Директивы условной компиляции
- •Директива #undef
- •Предопределенные макросы
- •69 Лекции по курсу «Языки программирования» Часть III
Битовые поля в структурах
Битовое поле — это элемент структуры, состоящий из заданного количества битов. Можно объявить битовое поле, состоящее из одного бита, двух битов или любого их количества, необходимого для хранения данных.
Реальное приложение на практике:
- для кодирования каких-то ситуаций, например «Да» - 1, «Нет» - 0. Достаточно одного бита.
- «За», «Против», «Воздержался» или не принимал участия в голосовании – достаточно 2-х бит и т.д.
Основная форма объявления такой структуры следующая:
struct имя_структуры {
тип имя1
:
длина_в_битах;
тип имя2 : длина_в_битах; направление возрастания адресов
. . .
тип имяN : длина_в битах;
};
В этом объявлении структуры тип может быть одним из следующих: int, unsigned или signed. Чаще всего unsigned. Если имена не используются, то их можно не указывать.
Длина структуры всегда кратна восьми. Так, если указать
struct onebit{
unsigned one_bit: 1;
} obj;
To для переменной obj будет выделено 8 бит, но использоваться будет только первый.
В структуре могут быть смешаны обычные переменные и поля битов.
Объединения
Объединения (unions) внешне похожи на структуры. Объединение объявляется и используется аналогичным образом. В отличие от структуры, всякий раз только один из элементов объединения доступен для обращения. Причина этого проста — все элементы объединения занимают одну и ту же область памяти, как бы располагаясь один поверх другого. В отличие от структуры для переменной типа union места в памяти выделяется ровно столько, сколько надо элементу объединения, имеющему наибольший размер в байтах.
Аналог объединения на Паскале – вариантная запись, где под вариантные поля выделена одна и та же область памяти.
Турбо Паскаль |
Турбо Си |
Var a:record case boolean of true :(b:char); false:(c:integer); end; |
union имя_объединения { char b; int c; } a; |
Замечания:
Довольно часто необходимо использовать одну и ту же область памяти для хранения значений разных типов. Это может потребоваться, например, для следующих целей:
минимизация используемого объема памяти, если в каждый момент времени только один объект из многих является активным;
интерпретация основного представления объекта одного типа как если бы этому объекту был назначен другой тип.
Для этих целей предусмотрен тип union, имеющий следующие формы записи:
union имя_обьединения { член(ы)_ объединения; } имя_переменной;
|
union имя_обьединения { член(ы)_ объединения; };
union имя_обьединения имя_переменной;
|
typedef union { член(ы)_ объединения; } синоним_типа; синоним_типа имя_переменной; |
Обращение к элементам объединения
Обращение к отдельным полям объединения выполняется так же, как к полям структуры: с помощью точки (.). Однако есть и существенное различие. Обращаться всякий раз можно только к одному элементу объединения, поскольку элементы хранятся один поверх другого.
Для объединений также разрешена операция ->, если мы обращаемся к объединению с помощью указателя.
При объявлении объединения его можно инициализировать. Раз уж только один элемент объединения может использоваться при каждом обращении к нему, то и инициализировать нужно только один элемент.