Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Auto (автоматична, локальна)



Ключове слово auto використовується рідко. Кожна змінна, описана в тілі функції (в середині блоку), обмеженого фігурними дужками, відноситься до класу пам'яті автоматичних (локальних) змінних:

int anyfunc(void)

{

char item;

........

}

Область дії локальної змінної іtem поширюється лише на блок, в якому вона оголошена. Пам'ять відводиться під змінну динамічно, під час виконання програми при вході y блок, в якому описана відповідна змінна. Локальна змінна тимчасово зберігається в стеку, коли функція починає свою роботу. Після закінчення роботи функції, або при виході з блоку знищує виділену стекову пам'ять, відкидаючи за необхідністю всі збережені змінні, тобто при виході з блоку пам'ять, відведена під усі його автоматичні змінні, автоматично звільняється (звідси й термін - automatic). З цієї причини декілька функцій безконфліктно можуть оголошувати локальні змінні з ідентичними іменами (це найчастіше буває з іменами лічильників циклів, індексів масивів тощо).

Отже, область видимості такої змінної розпочинається з місця її опису і закінчується в кінці блоку, в якому змінна описана. Доступ до таких змінних із зовнішнього блоку неможливий.

Застосування автоматичних змінних в локальних блоках дозволяє наближати опис таких змінних до місця їх розташування. Наступний приклад демонструє опис автоматичних змінних в середині блоку:

#include <stdio.h>

void main()

{

printf("\n Знаходимося в main().");

{

int i;

for(i=10;i>0;i--)

printf("\n%d",i);

printf("\n");

}

}

2) register (регістрова)

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

3) extern (зовнішня, глобальна)

Будь-яка змінна, описана не в тілі функції (без специфікатору класу пам'яті), по замовчуванню відноситься до extern - змінних (або глобальних змінних). Глобальні змінні продовжують існувати протягом усього життєвого циклу програми. Якщо користувач не вкаже ініційоване значення таким змінним, їм буде присвоєно початкове нульове значення. Найчастіше оголошення таких змінних розташовується безпосередньо перед main():

/*file1.c*/

#include <stdio.h>

int globalvar;

main()

{

/* operators */

}

Будь-які оператори у будь-якій функції файлу file1.c можуть виконувати читання та запис змінної globalvar. Але це ще не все! Виявляється, що глобальні змінні завжди залишаються під контролем завантажувача програми, що здійснює збірку програми із множини obj-файлів. Саме завдяки цьому до зовнішніх змінних можливий доступ з інших файлів. Для того, аби таку змінну можна було б використовувати в іншому файлі, слід задати специфікатор extern:

/*file2.c*/

#include<stdio.h>

void main()

{

extern globalvar;

printf("globalvar: %d", globalvar);

)

Опис extern globalvar; вказує компілятору на те, що ця змінна визначена як зовнішня та її опис знаходиться за межами даного файлу. У даному випадку опис extern розташований в середині функції, тому його дія впливає тільки на дану функцію. Якщо розмістити його ззовні будь-якої функції, то його дія пошириться на весь файл від точки опису.

Цікаво, якщо в середині блоку описана автоматична змінна, ім'я якої співпадає з іменем глобальної змінної, то в середині блоку глобальна змінна маскується локальною. Це означає, що в такому блоці видною буде саме автоматична, тобто локальна змінна.





Дата публикования: 2015-01-23; Прочитано: 366 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.006 с)...