- •12. Класи пам'яті даних 100
- •13. Робота з файлами 106
- •14. Посилання 111
- •Склад мови
- •Алфавіт мови
- •Лексеми
- •Ключові слова
- •Ідентифікатори
- •Константи
- •Символьні рядки
- •Знаки операцій, роздільники, коментарі
- •Типи даних
- •Класифікація типів даних
- •Цілочислові типи
- •Дійсні типи
- •Оголошення змінних і констант
- •Переліки
- •Структура програми
- •Функція main
- •Область дії змінної
- •Введення і виведення даних
- •Функції стандартної математичної бібліотеки
- •Вирази і операції
- •Поняття виразу, операнда, операції
- •Порядок виконання операцій
- •Арифметичні операції
- •Порозрядні операції
- •Операції порівняння
- •Логічні операції
- •Операції присвоєння
- •Умовна операція
- •Операція визначення розміру sizeof
- •Узгодження типів у виразах
- •Умовні оператори
- •Оператори
- •Умовний оператор if
- •Оператор вибору switch
- •Оператори циклу
- •Цикл з параметром. Оператор for
- •Цикл з передумовою. Оператор while
- •Цикл з постумовою. Оператор do while
- •Оператори переходу
- •Використання псевдовипадкових чисел
- •Одновимірні масиви
- •Багатовимірні масиви
- •Символьні рядки
- •Вказівники
- •Оголошення вказівника, операції, пов’язані з вказівниками
- •Адресна арифметика
- •Void – вказівники, типізація вказівників
- •Звертання до елементів масивів через вказівники
- •Масиви символьних рядків і масиви вказівників
- •Динамічне виділення пам’яті
- •Структури і об’єднання
- •Оголошення і ініціалізація структур
- •Звертання до елементів структур
- •Перейменування типів
- •Об’єднання
- •Поля бітів
- •Директиви препроцесора
- •Призначення директив препроцесора
- •Директива включення #include
- •Директиви макропідстановок #define I #undef
- •Директиви умовної компіляції
- •Директиви #ifdef, #ifndef
- •Функції
- •Структура функції
- •Виклик функцій. Прототипи функцій
- •Взаємодія фактичних і формальних параметрів функцій
- •Inline – функції
- •Масиви і символьні рядки як параметри функцій
- •Використання кваліфікатора const в оголошеннях параметрів
- •Багатовимірні масиви як параметри функцій
- •Опрацювання структур у функціях
- •Вказівники на функції
- •Рекурсивні функції
- •Класи пам'яті даних
- •Клас пам'яті, час існування і видимість об’єкта
- •Область дії глобальних і локальних змінних
- •Специфікатори класів пам'яті
- •Специфікатори глобальних змінних
- •Багатофайлові програми
- •Робота з файлами
- •Звертання до файлів
- •Послідовний запис до файлу і послідовне читання з файлу
- •Файли з довільним доступом
- •Посилання
- •Призначення посилань
- •Передача аргументів функцій як посилань
Специфікатори класів пам'яті
Якщо в описі змінної специфікатор класів пам'яті відсутній, то клас пам'яті такої змінної встановлюється за правилами замовчування. В оголошеннях змінних специфікатор класів пам'яті вказують першим словом:
специфікатор_класу_пам'яті тип ім’я_змінної
В оголошеннях локальних змінних можна використовувати кожен з специфікаторів, наведених в таблиці 12.1. За замовчуванням таким змінним присвоюється клас пам'яті auto, вони зберігаються в області стека, виділеного для програми в оперативній пам'яті.
Таблиця 12.1. Сецифікатори класів пам'яті
Специфіка-тор |
Клас пам'яті |
Застосування |
Час існування |
Область дії |
Автоматична ініціалізація |
|
Локальні змінні |
Глобальні змінні |
|||||
auto |
автоматичний |
так |
ні |
локальний |
локальна |
відсутня |
register |
регістровий |
так |
ні |
локальний |
локальна |
відсутня |
static |
статичний |
так |
так |
глобальний |
локальна / частково глобальна |
ініціалізація нулем |
extern |
зовнішній |
так |
так |
глобальний |
частково глобальна |
ініціалізація заборонена |
Специфікатор register початково призначався тільки для змінних з типом int. Він вказував, що за наявності вільного системного регістра змінну слід зберігати в регістрі процесора, а не в оперативній пам'яті, як інші змінні. Застосування змінних дає змогу істотно скоротити час звертання до змінних, тому регістровий клас надають тим змінним, які найбільше впливають на загальну швидкодію програми. Оскільки кількість системних регістрів комп’ютера обмежена, то за відсутності вільних регістрів змінна з класом пам'яті register буде опрацьовуватись як звичайна локальна змінна з класом пам'яті auto.
Стандарт С-89 і С-99 розширили визначення специфікатора register. Тепер він може застосовуватись до змінних різних типів і означає, що доступ до цих змінних повинен бути настільки швидким, наскільки це можливо.
До регістрових змінних не можна застосовувати операцію взяття адреси. Якщо змінна зберігається в системному регістрі, то її адреса вважається неозначеною.
Застосування специфікатора static до локальних змінних змінює час існування цих змінних. Статичні змінні існують протягом всього часу виконання програми, але областю їх дії залишається блок, в якому вони оголошені. В наступному прикладі статична змінна використовується для підрахування кількості викликів функції.
#include <iostream>
using namespace std;
void test( void ) {
static int n;
cout << ++n << endl;
}
int main( ) {
for ( int i = 0; i < 5; i++ )
test( );
}
Ініціалізація статичної змінної виконується один раз, при входженні до блоку, в якому вона оголошена. В цьому прикладі ініціалізація виконується при першому виклику функції. Після завершення роботи функції змінна n не буде знищена, її поточне значення зберігається і використовується в наступних викликах функцій.
Специфікатор extern застосовують в оголошеннях локальних змінних щоб вказати, що ця змінна є посиланням на глобальну змінну з тим самим іменем і типом, описану далі в тексті програми або в іншому програмному файлі. Це робить зовнішню змінну доступною для звертання в межах даного програмного блоку.
#include <iostream>
using namespace std;
void test( void ) {
extern double PI;
cout << PI << endl;
}
double PI = 3.14159;
int main( ) {
test( );
}
Тут змінна РІ, оголошена в функції test не є самостійною змінною, а тільки посиланням на глобальну змінну РІ, яка в тексті програми описана нижче.
