- •1.1 Перші кроки
- •1.2 Змінні й арифметичні вирази
- •1.3 Твердження for
- •1.4 Символічні константи
- •1.5 Ввід і вивід знаків
- •1.5.1 Копіювання файла
- •1.5.2 Відлік символів
- •1.5.3 Відлік рядків
- •1.6 Масиви
- •1.7 Функції
- •1.8 Аргументи - виклик за значенням
- •1.9 Символьні масиви
- •1.10 Зовнішні змінні й область дії
- •2.1 Назви змінних
- •2.2 Типи даних і розміри
- •2.3 Константи
- •2.4 Оголошення
- •2.5 Арифметичні операції
- •2.6 Реляційні та логічні оператори
- •2.7 Перетворення типів
- •2.8 Оператори приросту та спаду
- •2.9 Розрядні оператори
- •2.10 Оператори та вирази присвоєння
- •2.11 Вирази умов
- •2.12 Пріоритет і послідовність обчислення
- •3.1 Вирази та блоки
- •3.3 Else if
- •3.4 Switch
- •3.5 Цикли while та for
- •3.6 Цикли do-while
- •3.7 Break і continue
- •3.8 Goto та мітки
- •4.1 Основні знання про функції
- •4.2 Функції, які не повертають цілих
- •4.3 Зовнішні змінні
- •4.4 Правила області дії
- •4.5 Файли заголовка
- •4.6 Статичні змінні
- •4.7 Регістрові змінні
- •4.8 Структура блоків
- •4.10 Рекурсія
- •4.11 Препроцесор c
- •4.11.1 Включення файлів
- •4.11.2 Заміна макросів
- •4.11.3 Обумовлене включення файлів
- •5.1 Покажчики й адреси
- •5.2 Покажчики й аргументи функцій
- •5.3 Покажчики та масиви
- •5.4 Арифметика адрес
- •5.5 Покажчики на символи та функції
- •5.6 Масив покажчиків; покажчики на покажчики
- •5.7 Багатовимірні масиви
- •5.8 Ініціалізація масиву покажчиків
- •5.9 Покажчики в порівнянні з багатовимірними масивами
- •5.10 Аргументи командного рядка
- •5.11 Покажчики на функції
- •5.12 Складні оголошення
- •6.1 Основні поняття про структури
- •6.2 Структури та функції
- •6.3 Масиви структур
- •6.4 Покажчики на структури
- •6.5 Структури зі зворотнім звертанням
- •6.6 Пошук по таблиці
- •6.7 Typedef
- •6.8 Сполуки
- •6.9 Розрядні поля
- •7.1 Стандартний ввід і вивід
- •7.2 Форматований вивід - printf
- •7.3 Списки аргументів довільної довжини
- •7.4 Форматований ввід - scanf
- •7.5 Доступ до файлів
- •7.6 Обробка помилок - stderr і exit
- •7.7 Ввід і вивід рядків
- •7.8 Додаткові функції
- •7.8.1 Операції з ланцюжками
- •7.8.2 Перевірка і перетворення класів символів
- •7.8.3 Ungetc
- •7.8.4 Виконання команд
- •7.8.5 Керування пам'яттю
- •7.8.6 Математичні функції
- •7.8.7 Генератор випадкових чисел
- •8.1 Дескриптори файлів
- •8.2 Низькорівневий ввід/вивід - read і write
- •8.3 Open, creat, close, unlink
- •8.4 Довільний доступ - lseek
- •8.5 Приклад: втілення fopen і getc
- •8.6 Приклад - перелік вмісту каталогів
- •8.7 Приклад - розподільник пам'яті
4.6 Статичні змінні
Змінні sp і val зі stack.c а також buff і bufp із getch.c існують для приватного використання у функціях відповідних вихідних файлів і не призначені для доступу чимось іншим. Оголошення static зовнішньої змінної або функції обмежує зону дії цього об'єкту рештою вихідного файла, який буде компільовано. Зовнішній static, таким чином, дає можливість приховати такі назви як buf і bufp у комбінації з getch-ungetch, які в свою чергу, теж повинні бути зовнішніми для спільного їхнього використання, але чиї подробиці не повинні бути видимими користувачам getch і ungetch. Статичний тип зберігання даних вказується шляхом додання слова static перед звичайним оголошенням. Якщо дві функції і дві змінні компільовано у одному файлі, як от
static char buf[BUFSIZE]; /* буфер для ungetch */
static int bufp = 0; /* наступне вільне положення в buf */
int getch(void) { ... }
void ungetch(int c) { ... }
тоді жодна інша функція не в змозі буде звернутися до buf і bufp і ці назви не створюватимусть конфлікту з такими самими назвами в інших файлах тієї самої програми. Аналогічно, змінні, які використовуються функціями push i pop для маніпулювання стеком, можна приховати, якщо оголосити sp і val як static.
Зовнішні статичні змінні найчастіше вживаються зі змінними, але їх можна застосовувати також до функцій. Звично, назви функцій являються глобальними, тобто їх видно з будь-якої частини програми. Проте, якщо функцію оголошено як static, її назва стане невидимою поза межами файла, в якому її було оголошено.
Означення static застосовується також щодо внутрішніх змінних. Внутрішні статичні змінні являтимуться локальними для даної функції, так само як автоматичні змінні, але на відміну від останніх, вони залишатимуться дійсними, зберігаючи своє значення, замість появи і зникнення кожного разу як функцію викликано. Це означає, що внутрішні статичні змінні надають приватне, постійне збереження даних у межах однієї функції.
Вправа 4-11. Змініть getop, таким чином, щоб їй не потрібно було використовувати ungetch. Підказка: застосуйте внутрішню статичну змінну.
4.7 Регістрові змінні
Оголошення регістрової змінної вказує компілятору, що дана змінна буде інтенсивно використовуватись. Ідея полягає у тому, що регістрові змінні поміщено у регістри процесору, що призводить до менших і швидших програм. Але компілятори вільні ігнорувати цю пораду. Оголошення регістрових змінних може виглядати як
register int x;
register char c;
і так далі. Регістрові оголошення можуть застосовуватись до автоматичних змінних і до формальних параметрів функції. У останньому випадку, це може мати вигляд
f(register unsigned m, register long n)
{
register int i;
...
}
На практиці, на регістрові змінні накладено обмеження, що відображають можливості підставового устаткування. Тільки декілька змінних з кожної функції можуть бути збереженими в регістрах і тільки певні типи дозволяються. Надмір регістрових оголошень не є шкідливим, тим не менш, оскільки слово register ігноровано для зайвих або заборонених оголошень. Адресу регістрової змінної неможливо отримати (отримання адрес змінних розглянуто у Розділі 5), незалежно від того, чи змінну справді розміщено у регістрі, чи ні. Обмеження кількості і типів регістрових змінних відрізняється на різних машинах.
