- •Функции.
- •Вызов функции с переменным числом параметров
- •Функция main и её параметры.
- •Директивы препроцессора (прекомпилера).
- •Объявление указателей.
- •Модификатор const.
- •Операции.
- •Указатели на различные типы.
- •Указатель на void.
- •Применение указателей для передачи данных между функциями.
- •Массивы.
- •Индексация массивов.
- •Хранение массива в памяти. Адреса элементов. Хранение массива в памяти.
- •Массивы и константные указатели.
- •Статическое и динамическое выделение памяти.
- •Функции calloc, malloc, free
- •Функция realloc
- •Передача массивов в качестве аргументов функции.
- •Указатели на функции.
- •Библиотеки функций.
- •Функции форматированного ввода-вывода.
- •Функция printf().
- •%[Флаги] [Ширина] [.Точность] [{h | l | I | i32 | i64}]тип
- •Для чего нужен форматированный вывод.
- •Функция scanf().
- •Функции sprintf() и sscanf().
- •Функции fprintf() и fscanf().
- •Функции неформатированного ввода-вывода.
- •Работа со строковыми данными (стрингами). Представление строковых данных в языке c.
- •Функции работы со строками.
- •Потоковый ввод-вывод
- •Функции форматированного ввода-вывода.
- •Функция printf().
- •%[Флаги] [Ширина] [.Точность] [{h | l | I | i32 | i64}]тип
- •Для чего нужен форматированный вывод.
- •Функция scanf().
- •Функции sprintf() и sscanf().
- •Функции fprintf() и fscanf().
- •Функции неформатированного ввода-вывода.
- •Функции работы с файлами.
- •Потоковый ввод-вывод
- •Работа с потоками
- •Курсор.
- •Ввод-вывод отдельных символов и строк.
- •Форматированный ввод-вывод информации в файл.
- •Блочный потоковый ввод-вывод
- •Смена текущей позиции в файле. Проверка конца файла.
- •Функции доступа к файлам нижнего уровня.
- •Методы сортировки данных.
- •Введение
- •Сравнение методов сортировки
- •Программная реализация алгоритмов сортировки
- •Метод пузырька.
- •Метод обмена.
- •Метод вставки.
- •Метод Шелла.
- •Метод кучи (бинарной кучи).
- •Очередь
- •Линейный список
- •Физическое (машинное) представление линейных списков
- •Программные реализации структур данных. Стек. Реализация в виде массива.
- •Стек. Связанное представление.
- •Очереди. Реализация в виде массива.
- •Дерево. Связанное представление.
- •Рекурсивный вызов функций.
- •Структуры. Объединения. Перечисления.
- •Перечисление (enum).
- •Производные типы данных.
- •Структура (struct).
- •Побитовое описание полей структуры.
- •Объявление переменных, реализующих структуру.
- •Доступ к элементам структуры.
- •Объединение (union).
- •Вложенное описание структур и объединений.
- •Описание структур и объединений в виде пользовательского типа.
- •Передача структур и объединений в виде параметров функции.
- •Инициализация структур и объединений.
- •Выгода от использования структур
Побитовое описание полей структуры.
При описании структуры возможно также побитовое описание полей (элементов), т.е. описание длины элементов структуры с точностью до бита. Это обеспечивается с помощью дополнительного суффикса ":n" и типа int где n – количество бит, отведённых под данное поле. Например:
struct st1
{
int a:3;
int b:4;
int c:5;
char d;
}
При этом под переменную a в структуре отводится 3 бита, под переменную b – 4 бита, под переменную c – 5 бит. Для переменных a,b и c будет выделено ровно столько бит памяти, сколько указано, но в целом последний элемент с побитовой записью будет дополнен таким количеством бит и байтов (с нулевыми значениями), чтобы его длина соответствовала длине типа int (для платформы Win32 дополнение будет производиться до 4 байт).
Информация в структуре с побитовым описанием элементов на платформе Win32 записывается в память в прямом порядке следования элементов, но начиная с самых младших байт и самых младших битов (на других платформах возможны другие правила). Т.е., как это и принято на платформе Win32, числа записываются в память начиная с младших битов и байтов, но в порядке следования полей.
Например, для предыдущего примера, занесём в элементы структуры следующие значения:
a=6; // В бинарном виде 00000110
b=8; // В бинарном виде 00001000
c=10; // В бинарном виде 00001010
d=12 // В бинарном виде 00001100
Тогда в памяти значения будут храниться в следующем виде (условные обозначения: LSB – Less Significant Bit, Наименее значащий бит; MSB – Most Significant Bit, Наиболее значащий бит)
0 |
1 |
1 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
||
int a:3; |
int b:4; |
int c:5; |
Биты выравнивания |
↑ LSB Байт 0 MSB Байт 0 ↑ ↑ LSB Байт 1 MSB Байт 1 ↑
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
Биты выравнивания |
↑ LSB Байт 2 MSB Байт 2 ↑ ↑ LSB Байт 3 MSB Байт 3 ↑
0 |
0 |
1 |
1 |
0 |
0 |
0 |
0 |
char d; |
↑ LSB Байт 4 MSB Байт 4 ↑
Таким образом, вся реализация структуры в памяти представляется в виде пяти байт:
0x46
0x05
0x00
0x00
0x0c
Практическое применение побитовая запись имеет при необходимости записи/чтения только нескольких бит в числе. Например, число типа char можно представить в виде следующей побитовой структуры:
struct BitChar
{
char bit0:1;
char bit1:1;
char bit2:1;
char bit3:1;
char bit4:1;
char bit5:1;
char bit6:1;
char bit7:1;
};
При такой записи, записывая или считывая значения из какого-либо поля этой структуры, программист получает возможность доступа к отдельному биту числа.