МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
Національний університет «Львівська політехніка»
Кафедра «Телекомунікації»
КЛАСИ ПАМ’ЯТІ
Методичні вказівки до лабораторної роботи з дисципліни
«Інформатика телекомунікаційних систем та мереж, ч.IІ»
для студентів базового напряму 6.0924
«Телекомунікації»
Затверджено
на засіданні кафедри «Телекомунікації»
Національного університету
«Львівська політехніка»,
протокол №___ від______2009р.
Львів 2009
МЕТА РОБОТИ: дослідити властивості змінних різних класів пам’яті. Оволодіти механізмом визначення та опису глобальних змінних.
Попередні відомості.
Специфікація класу пам’яті змінної визначає час її життя в програмі (глобальний або локальний) та область її дії. Об’єкт з глобальним часом життя існує і має значення на протязі всього часу виконання програми. Всі функції мають глобальний час життя.
Змінній з локальним часом життя виділяється нова комірка пам'яті кожен раз, коли управління передається блоку, в якому вона визначена. Коли управління повертається з блоку, змінна губить свої значення.
В мові С існуї чотири специфікації класів пам’яті:
auto
register
static
extern
Область дії функцій, декларованих із специфікаціїю класу пам'яті extern, розповсюджується на всі вихідні файли, які складають програму і такі функції можуть бути викликані з будь-якої функції в будь-якому вихідному файлі програми.
Змінні класів пам'яті auto i register мають локальний час життя. Специфікації static і extern визначають об’єкти з глобальним часом життя.
В сукупності з розташуванням декларації об’єкту специфікація класу пам'яті визначає область дії змінної або функції – частину програми, в якій до функції або змінної можливий доступ. Оголошення, розташовані зовні тіл усіх функцій, відносяться до зовнішнього рівня, а оголошення всередині тіла функції - до внутрішнього рівня.
На зовнішньому рівні використовуються тільки класи пам’яті static i extern:
static - така змінна може бути явно ініціалізована константним виразом, в противному випадку вона автоматично ініціюється нулем; область дії - від точки її визначення (вище цієї точки вона недоступна) до кінця вихідного файлу (присутність в інших вихідних файлах змінної з таким самим іменем означає зовсім іншу, незалежну від цієї, змінну);
extern - використовується для опису (декларації, оголошення) змінної, визначеної в іншому місці програми, коли потрібно розповсюдити на даний вихідний файл область дії змінної, яка визначена в іншому вихідному файлі, або розширити зону дії змінної вище її визначення.
Допускається тільки одне визначення зовнішньої змінної.
На внутрішньому рівні може бути специфікований будь-який з чотирьох класів пам’яті. За замовчуванням вважається клас пам’яті auto - це змінна з локальним часом життя, і область її дії розповсюджується на блок, в якому вона оголошена. Змінні класу
auto автоматично не ініціюються, за надання їм певного значення відповідає програміст.
Змінну класу пам’яті register компілятор розміщує якщо це можливо в регістрі мікропроцесора. Це прискорює доступ до змінної і зменшує код виконуваної програми; область дії та ж сама, що й у змінної auto; розмір об’єкту - не більший, ніж тип int; якщо компілятор не знаходить можливості розмістити змінну в регістрі, їй надається клас auto.
Змінна, оголошена на внутрішньому рівні, як static, має глобальний час життя, але її дія розповсюджується тільки на блок, в якому вона декларована; на відміну від змінних auto, змінні static зберігають свої значення після виходу з блоку. Змінні класу пам’яті static можуть бути ініціалізовані константним виразом, а якщо явної ініціалізації немає, то змінна автоматично ініціюється нулем.
Змінна, оголошена специфікацією класу пам’яті extern, є посиланням на змінну з тим самим іменем, визначену на зовнішньому рівні в будь-якому вихідному файлі програми.
Мета внутрішньої декларації extern полягає в тому, щоб зробити визначення змінної зовнішнього рівня (як правило, представлене в іншому вихідному файлі) доступним саме всередині даного блоку. Внутрішня декларація extern не впливає на область дії декларованої глобальної змінної в будь-якій іншій частині програми.
Приклад:
int i = 1; /* визначення i */
main()
{
extern int i; /* декларація i, що посилається на визначення, яке представлене вище */
static int a; /* початкове значення a дорівнюї 0; область дії а - функція main */
register int b = 0; /* b буде за можливістю розміщене в регістрі */
int c = 0; /* за замовчуванням c матиме клас пам’яті auto */
printf("%d,%d,%d,%d\n",i,a,b,c); /* друк i,a,b,c */
other();
}
other()
{
int i = 16; /* локальне перевизначення i */
static int a = 2; /* область дії змінної а - функція other() */
a += 2;
printf("%d,%d\n",i,a); /* друк i,a */
}
Ця програма надрукує:
1,0,0,0
16,4
ЗАВДАННЯ
Дослідити роботу програми, текст якої приведений в прикладі.
Скласти програму, яка складається з функції main (перший файл) та двох інших функцій, записаних в другому файлі. Функція main вводить з екрану число D - множник геометричної прогресії, викликає першу функцію, яка повинна повернути значення суми N членів прогресії, друкує значення суми. Перша функція повинна здійснити ініціалізацію масиву з N елементів - членів геометричної прогресії з множником D і викликати другу функцію, яка обчислює суму N членів прогресії і повертає значення суми в першу функцію. При написанні програми використати локальні та глобальні змінні.
Контрольні запитання.
Які специфікатори класів пам’яті можуть застосовуватися для позначення автоматичної папм’яті?
Що таке статична внутрішня пам’ять?
Глобальні об’єкти.
Динамічна пам’ять.
Зовнішні об’єкти і доступ до них.
Список рекомендованої літератури.
Керниган, Ритчи. Программирование на С. М. – 1984, 1990.
Березин А.К., Березина В.И. Программирование на С и С++. М. – 1996.
Бочков С.О. Субботин Д.М. Язык программирования Си для персонального комп’ютера. М.- Диалог-1990.
Подбельский В.В. Фомин С.С. Прграммирование на языке Си. М.-Финансы и статистика. – 2002.