Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
КТіП Лекції 20110516 (1).doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1 Мб
Скачать
☆
    1. Специфікатори класів пам'яті

Якщо в описі змінної специфікатор класів пам'яті відсутній, то клас пам'яті такої змінної встановлюється за правилами замовчування. В оголошеннях змінних специфікатор класів пам'яті вказують першим словом:

специфікатор_класу_пам'яті тип ім’я_змінної

В оголошеннях локальних змінних можна використовувати кожен з специфікаторів, наведених в таблиці 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 не є самостійною змінною, а тільки посиланням на глобальну змінну РІ, яка в тексті програми описана нижче.