
- •Вказівники на функції. Масиви вказівників на функції. Приклади.
- •В казівники на функції. Функції як параметри функцій. Приклади.
- •Функції з довільним числом параметрів. Приклади.
- •Обробка символів та масивів символів. Бібліотечні функції обробки символів.
- •Рядки. Подання рядків у пам’яті. Ініціалізація. Рядкові літерали.
- •Структури. Оголошення та ініціалізація. Розміщення у пам’яті. Приклади.
- •Структури. Вкладені структури. Доступ до полів структур, вкладених структур. Приклади.
- •Структури. Вказівники на структури. Динамічні структури. Приклади.
- •Структури з бітовими полями. Оголошення та ініціалізація. Обробка.
- •Структури як параметри та результати функцій.
- •Масиви структур. Оголошення, ініціалізація. Обробка.
- •Об’єднання. Розміщення у пам’яті. Ініціалізація. Обробка.
Структури з бітовими полями. Оголошення та ініціалізація. Обробка.
Мовам С має можливість, яка називається бітовими полями, що дозволяє працювати з окремими бітами. Бітові поля корисні з кількох причин:
Якщо обмежено місце для зберігання інформації, можна зберегти кілька логічних (істина / неправда) змінних в одному байті.
Деякі інтерфейси пристроїв передають інформацію, закодувавши біти в один байт.
Деяким процедурам кодування необхідно отримати доступ до окремих бітам в байті.
Хоча всі ці функції можуть виконуватися за допомогою бітових операторів, бітові поля можуть внести більшу ясність в програму.
Метод використання бітових полів для доступу до біт заснований на структурах.
Бітове поле, насправді, - це просто особливий тип структури, що визначає, яку довжину має кожний член. Стандартний вигляд оголошення бітових полів наступний:
struct ім'я структури {
тип імя1: довжина;
тип імя2: довжина;
...
тип імяN: довжина;
}
Бітові поля повинні оголошуватися як int, unsigned або signed. Бітові поля довжиною 1 повинні оголошуватися як unsigned, оскільки 1 біт не може мати знака. Бітові поля можуть мати довжину від 1 до16 біт для 16-бітних середовищ і від 1 до 32 біт для 32-бітних середовищ.
Розглянемо наведене нижче визначення структури:
struct device {
unsigned active: 1;
unsigned ready: 1;
unsigned xmt_error: 1;
} Dev_code;
Дана структура визначає три змінні по одному біту кожна. Структурна змінна dev_code може, наприклад, використовуватися для декодування інформації з порту стрічкового накопичувача. Для такого гіпотетичного стрічкового накопичувача наступний фрагмент коду записує байт інформації на стрічку і перевіряє на помилки, використовуючи dev_code:void wr_tape (char с)
{
while (! dev_code.ready) rd (& dev_code); / * Чекати * /
wr_to__tape (с); / * Запис байта * /
while (dev_code.active) rd (& dev_code); / * Очікування закінчення запису інформації * /
if (dev_code.xmt error) printf ("Write Error");
}
Тут rd () повертає статус стрічкового накопичувача wr_to_tape (), записує дані. Малюнок показує, як виглядає змінна dev_code в пам'яті.
Як можна бачити з попереднього прикладу, до кожного полю відбувається звернення за допомогою оператора "крапка". Проте якщо звернення до структури відбувається за допомогою показника, то слід використовувати оператор ->.
Немає необхідності обзивати кожне бітове поле. До полю, що має назву, легше отримати доступ. Наприклад, якщо стрічковий накопичувач повертає інформацію, про настання кінця стрічки в п'ятому біті, слід змінити структуру device наступним чином:
struct device {
unsigned active: 1;
unsigned ready: 1;
unsigned xmt_error: 1;
unsigned: 2;
unsigned EOT: 1;
} Dev_code;
Бітові поля мають деякі обмеження.
Не можна отримати адресу змінної бітового поля.
Змінні бітового поля не можуть поміщатися в масив.
Переходячи з комп'ютера на комп'ютер не можна бути впевненим у порядку зміни бітів (зліва направо або справа наліво).
Будь-який код, який використовує бітові поля, залежить від комп'ютера.
Нарешті, можна змішувати різні структурні змінні в бітових полях. Наприклад:
struct emp {
struct addr address;
float pay;
unsigned lay_off: 1;
unsigned hourly: 1;
unsigned deductions: 3;
};
визначає запис службовця, що використовує тільки один байт для зберігання трьох частин інформації - статусу службовця, чи отримав він зарплату і розмір утримань. Без використання бітових полів дана інформація зайняла б три байта.