В этом руководстве вы узнаете об области действия и времени жизни локальных и глобальных переменных. Также вы узнаете о статических и регистровых переменных.
Каждая переменная в программировании на C имеет два свойства: тип и класс хранения.
Тип относится к типу данных переменной. А класс хранения определяет область видимости и время жизни переменной.
Есть 4 типа класса хранения:
- автоматический
- внешний
- статический
- регистр
Локальная переменная
Переменные, объявленные внутри блока, являются автоматическими или локальными переменными. Локальные переменные существуют только внутри блока, в котором они объявлены.
Возьмем пример.
#include int main(void) ( for (int i = 0; i < 5; ++i) ( printf("C programming"); ) // Error: i is not declared at this point printf("%d", i); return 0; )
При запуске указанной выше программы вы получите сообщение об ошибке с необъявленным идентификатором i. Это потому, что я объявлен внутри for
блока цикла. За пределами квартала это не декларировано.
Возьмем другой пример.
int main() ( int n1; // n1 is a local variable to main() ) void func() ( int n2; // n2 is a local variable to func() )
В приведенном выше примере n1 является локальным, main()
а n2 - локальным func()
.
Это означает, что вы не можете получить доступ к переменной n1 внутри, func()
поскольку она существует только внутри main()
. Точно так же вы не можете получить доступ к переменной n2 внутри, main()
поскольку она существует только внутри func()
.
Глобальная переменная
Переменные, объявленные вне всех функций, называются внешними или глобальными переменными. Они доступны из любой функции внутри программы.
Пример 1: глобальная переменная
#include void display(); int n = 5; // global variable int main() ( ++n; display(); return 0; ) void display() ( ++n; printf("n = %d", n); )
Вывод
п = 7
Предположим, глобальная переменная объявлена в file1
. Если вы попытаетесь использовать эту переменную в другом файле file2
, компилятор пожалуется. Чтобы решить эту проблему, extern
используется ключевое слово in, file2
чтобы указать, что внешняя переменная объявлена в другом файле.
Регистровая переменная
register
Ключевое слово используется для объявления переменных регистра. Регистровые переменные должны были быть быстрее локальных.
Однако современные компиляторы очень хороши в оптимизации кода, и есть редкая вероятность, что использование регистровых переменных сделает вашу программу быстрее.
Если вы не работаете со встроенными системами, в которых вы знаете, как оптимизировать код для данного приложения, регистровые переменные не используются.
Статическая переменная
Статическая переменная объявляется с помощью static
ключевого слова. Например;
статический int i;
Значение статической переменной сохраняется до конца программы.
Пример 2: статическая переменная
#include void display(); int main() ( display(); display(); ) void display() ( static int c = 1; c += 5; printf("%d ",c); )
Вывод
6 11
Во время первого вызова функции значение c инициализируется равным 1. Его значение увеличивается на 5. Теперь значение c равно 6, которое выводится на экран.
Во время второго вызова функции c не инициализируется снова в 1. Это потому, что c - статическая переменная. Значение c увеличивается на 5. Теперь его значение будет равно 11, и оно будет напечатано на экране.