Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
53
Добавлен:
11.05.2015
Размер:
547.84 Кб
Скачать

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

По умолчанию объявленные в функции переменные являются автоматическими. Тем не менее, это можно явно задать с помощью ключевого слова auto:

void main()

{

auto int Numb;

Это выполняется, например, в целях подчеркивания того факта, что описание внешней функции намеренно перекрывается, либо когда требуется не изменять класс памяти переменной.

Автоматическая переменная имеет

- область видимости в пределах блока. Другая функция может использовать переменную с тем же именем, но это будет независимая переменная, хранимая в другом месте памяти.

- не имеет связывания. Ее нельзя дважды объявлять в одном и том же блоке. Можно определять переменные, имеющие одинаковые имена, но существующие в различных блоках.

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

Внешние (глобальные) переменные

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

Правило! Если переменная описана в другом модуле, применение ключевого слова extern в ее описании обязательно. Если определение внешней переменной в исходном файле расположено выше функции, где она используется, то в описании extern нет необходимости.

Модуль А:

int e_name;

extern double mult, coef[]; //Можно не указывать размер массива

int funcA0()

{ … // e_name, mult, coef[]

}

int main()

{ …

}

Модуль B:

extern int e_name;

double mult, bound;

int funcB0()

{ … // e_name, mult, bound

}

Модуль C:

extern int e_name;

extern double mult;

double coef[10];

int funcC0()

{ … // e_name, mult, coef[10]

}

Отметим, что в случае совпадения имен внутренней и внешней переменной какой-то функции, в данной функции будет использоваться внутренняя переменная, т. е.:

int e_name;

int funcA0();

int funcA0()

{ int e_name = 11;

printf (“\nfuncA0: e_name = %d”, e_name);

}

int main()

{ …

e_name = 77;

funcA0();

printf (“\nmain: e_name = %d”, e_name);

}

В результате:

funcA0: e_name = 11

main: e_name = 77

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

Статические переменные

Название «статическая» означает, что переменная сохраняет свое значение после выхода из функции. Область видимости статических локальных переменных такая же, как автоматических, но они не исчезают при завершении функции, которая их содержит. Таким образом, статический класс памяти имеет область видимости в пределах блока, но статическую продолжительность хранения. Компьютер запоминает значения статических переменных в промежутках между вызовами функции.

void Stat()

{

int i;

for (i=0; i< 3; i++)

printf ("\nValue=%d",GetNext());

printf ("\n");

}

int GetNext()

{

static int X=0;

return (X++); // (X++) == X++, Возвращается X, а не X++

}

Результат:

Value=0

Value=1

Value=2

Следует отметить, что переменные типа static могут также объявляться вне всех функций. При этом создается внешняя статическая переменная. Различие между обычной и статической внешней переменной состоит в их связывании. Обычная внешняя переменная может использоваться функциями в любом модуле программы (требуется объявление его в этом модуле как extern), а статическая – только функциями одного модуля (недопустимо extern static).

Имена статических локальных переменных известны только функции или блоку кода в которых они объявлены, а имена статических глобальных переменных известны только в файле, в котором они находятся. В сущности, модификатор static разрешает использование функциями переменных, не беспокоя другие функции. Статические переменные позволяют «прятать» части программы.