Сдам Сам

ПОЛЕЗНОЕ


КАТЕГОРИИ







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





 

Класс памяти определяет область действия переменной и продолжительность ее существования в памяти. Класс памяти устанавливается при описании переменной с соответствующим ключевым словом. Переменные, определенные вне функции, являются внешними и имеют глобальную область действия. Переменные, определенные внутри функции, являются автоматическими и локальными, если только не используются другие ключевые слова. Внешние переменные, определенные раньше функции, доступны ей, даже если они не описаны внутри её.

До сих пор мы имели дело с локальными переменными, которые доступны только в одной функции. В данном случае переменные 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 классов памяти, которые разбиваются на 2 группы: глобальные и локальные. Для их описания используются ключевые слова:

extern - внешний,

auto - автоматический,

static - статический

register - регистровые.

Имеются понятия: время жизни – это время, в течение которого переменная существует; область видимости – это место в программе, где можно работать с переменной, обратиться к ней. ВЖ и ОВ не совпадают у различных классов памяти.

 

I. Глобальные переменные

 

1. Extern - внешние переменные

Хранятся в области данных программы. Определяются до main() и доступны в любой функции программы. Время жизни - программа. При определении инициализируются по умолчанию 0 на стадии компиляции. Область видимости вся программа. Создаются в области статических данных программы.

int count;

void main (void){

count ++;

.........

}

func (){

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;

............................

} }

Переменная из одного модуля может быть использована в другом с помощью ключевого слова extern. В момент определения выделяется память.

Класс extern используется для того, чтобы было возможным использование переменной в других модулях, то есть для связи больших частей программы.

Статические внешние переменные – static

Ограничены одним модулем. Определяются до main(). Доступны всем функциям в одном модуле (область видимости один модуль). Время жизни - работа всей программы. Инициализируются по умолчанию 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);

}

II. Локальные переменные

 

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 помещаются в регистры микропроцессора для увеличения скорости вычисления. Если нет свободного регистра, рассматриваются как автоматические. Область видимости блок, в котором были определены.

Эти переменные работают значительно быстрее. Но:

1) i будет регистровой, если на данный момент есть свободный регистр МПП.

2) Компиляторы настолько интеллектуальны, что сами определяют какие переменные сделать регистровыми, а какие нет.

 

5. Автоматические локальные переменные

Определяются внутри любого блока. Время жизни работа блока. Создаются в области стека. Область видимости блок, в котором были определены. По умолчанию не инициализируются.

 

Пример 1.

if (i==1){

int j=0;

int k=1;

i++;

}

printf(“%d %d”,j,k); //сообщение об ошибке

 

Пример 2.

 

int i;

......

{

int i; Внешнее i не видимо

......

}

...... Здесь опять ее видно

 

Существует понятия области видимости и области существования. Область видимости не может выходить за область существования, но область существования может превышать область видимости.

Таблица 1. Классы памяти и инициализация

Класс Хранения Внешний Extern Внешний Статический static Аргумен. Функции Автоматические auto Регистровые Register Внурен. Статические Static
Область действия Программа Модуль Функция Блок Блок Блок
Время Жизни Программа Программа Функция Блок Блок Программа
Область Хранения Сегмент Данных Сегмент данных Сегмент стека Сегмент стека Регистры МП Сегмент данных
Инициал-емость объектов Все Все Не раз-решена в Си Все в С++   Все Все
Момент инициализации На стадии Компил. На стадии компил. При входе в блок При входе в блок При входе в блок На стадии компил.
Инициализация по умолчан. Инициализируются 0 Инициализируются 0 Значение указывается Значение не опред. Значение не опред. Инициализируется 0

 

ПРЕПРОЦЕССОР ЯЗЫКА СИ

 

Препроцессор предназначен для предварительной обработки программы перед компиляцией при помощи специальных директив. (Препроцессор выполняет еще один шаг перед собственно компиляцией исходного файла, называемый предварительно обработкой.) Признаком директивы является символ # в первой позиции строки. Препроцессор просматривает программу и заменяет символьные аббревиатуры в программе на соответствующие директивы. Он расширяет возможности языка 3 функциями.

1. Подстановкой имен;

2. Включением файлов;

3. Условной компиляцией.

Это позволяет создавать мобильные, более удобочитаемые и более удобные для сопровождения программы.

# - первый символ в левой позиции, в любом месте исходного файла сообщает препроцессору, что далее следует директива. Она имеет действие до конца файла.

 

Подстановка имен

Директивы

#define (макроподстановка) – создать макроопределение. Эта директива отаскивает символические аббревиатуры в программе и заменяет их соответствующим текстом. Она может появиться в любом месте исходного файла, а даваемое ею определение имеет силу до конца файла или до директивы #undef.

Float Pi=3.14; - это подстановка во время выполнения, а #define PI 3.14 – это подстановка во время компиляции, т.е. к моменту выполнения программы все подстановки выполнены. Константы пишут большими буквами!

 

#undef - удалить макроопределение, отменить определение для соответствующего идентификатора.

 

Директива #define служит для

 







ЧТО И КАК ПИСАЛИ О МОДЕ В ЖУРНАЛАХ НАЧАЛА XX ВЕКА Первый номер журнала «Аполлон» за 1909 г. начинался, по сути, с программного заявления редакции журнала...

Что будет с Землей, если ось ее сместится на 6666 км? Что будет с Землей? - задался я вопросом...

ЧТО ПРОИСХОДИТ, КОГДА МЫ ССОРИМСЯ Не понимая различий, существующих между мужчинами и женщинами, очень легко довести дело до ссоры...

Конфликты в семейной жизни. Как это изменить? Редкий брак и взаимоотношения существуют без конфликтов и напряженности. Через это проходят все...





Не нашли то, что искали? Воспользуйтесь поиском гугл на сайте:


©2015- 2024 zdamsam.ru Размещенные материалы защищены законодательством РФ.