Загрузка...

КЛАССЫ ПАМЯТИ И ОБЛАСТЬ ДЕЙСТВИЯ.


До сих пор мы имели дело с локальными переменными, которые доступны только в одной функции. В данном случае переменные a, b в main и myfunc являются разными переменными. void myfunc(int, int); void main (void){ int a=5, b=10; printf («%d %d\n», a, b); myfun (a, b); printf («%d %d\n», a, b); } void myfun (int a, int b){ a++; b++; printf («%d %d\n», a, b); } Каждая существует только в своей функции и доступна только в ней. Физически это разные ячейки памяти. Такие переменные называются «локальными». Но иногда требуются переменные доступные из любой функции и даже модуля программы. Такие переменные называются «глобальными». Каждая переменная в Си принадлежит некоторому классу памяти. Всего существует 5 классов памяти. Для их описания используются клю-чевые слова: extern — внешний, auto — автоматический, static — статический register — регистровые. Глобальные переменные 1. Extern — внешние переменные хранятся в области данных программы. Определяются до main() и доступны в любой функции программы. Время жизни — программа. При определении инициализируются по умолчанию 0 на стадии компиляции. Область видимости вся программа. int count; void main (void){ count ++; ……… } fun (){ printf («%d\n», count); } Переменная count является внешней и доступна в обеих функциях. Если в программе есть одноименная локальная переменная она закрывает глобальную. Для расширения видимости операция расширения доступа :: int count; void main (void){ int count; //автоматическая переменная ::count++; ………. printf(“%d”,::count); } void fun (void){ count ++; printf («%d\n»,count); } Если переменная определяется в одном модуле, но к ней есть обращение в другом, то нужно обязательно это указать, объявив ее как внеш-нюю, иначе будет создана новая переменная с этим именем. I модуль. II модуль. int cost; void func (void){ void main (void){ extern int cost; ………… ……………. } } 2. Статистические внешние переменные — static Ограничены одним модулем. Доступны всем функциям в одном модуле (область видимости один модуль). Время жизни работа всей программы. Инициализируются по умолчанию 0 на стадии компиляции. Создаются в области данных программы. static int num; void main (void){ int count; for (count=1; count<5; count ++){ printf («%d\n», count); fun (); } } void fun (void){ int i=1; num ++; printf («%d %d\n», i, num); } Локальные переменные 3. Внутренняя статическая переменная. Объявляется и определяется внутри одной функции, блока. Инициализируют 0 на стадии компиляции. Создаётся в области данных. Время жизни — работа всей программы, но область видимости только эта функция. При многократном вызове сохраняет своё значение. Инициализирует только 1 раз. void main (void){ int count; for (count=1; count<5; count ++){ printf («%d\n», count); fun (); } } void fun (void){ static int num; int i=1; printf («%d %d\n», i, num++); } 4.Регистровая переменная. register int i помещаются в регистры микропроцессора для увеличения скорости вычисления. Если нет свободно-го регистра, рассматриваются как автоматические. Область видимости блок, в котором были определены. 5.Автоматические переменные — определяются внутри любого блока. Время жизни работа блока. Создаются в области стека. Область видимости блок, в котором были определены. if (i==1){ int j=0; int k=1; i++; } printf(“%d %d”,j,k); //сообщение об ошибке int i; …… { int i; Внешнее i не видимо …… } …… Здесь опять ее видно Существует понятия области видимости и области существования. Область видимости не может выходить за область существования, но область существования может превышать область видимости. Классы памяти и инициализация Класс хранения Внешний Extern Внешний Статический static Аргумен. Функции Автоматические auto Регистровые register Внурен. статические Static Область действия Програм-ма Модуль Функция Блок Блок Блок Время Жизни Програм-ма Програм-ма Функция Блок Блок Програм-ма Область хранения Сегмент Данных Сегмент данных Сегмент стека Сегмент стека Регистры МП Сегмент данных Инициал-емость объектов Все Все Не раз-решена в Си Все в С++ В Си нельзя массивы и стр-ры Все Все Момент инициализации На стадии Компил. На стадии компил. При входе в блок При входе в блок При входе в блок На стадии компил. Инициализация по умолчан. Инициализируются 0 Инициализируются 0 Значение указывается Значение не опред. Значение не опред.

Загрузка...