Внешние (глобальные) переменные
Внешние переменные — это переменные, которые может использовать любая функция программы. В некоторых языках они носят название глобальных переменных. Для того чтобы создать внешнюю переменную, ее следует определить перед функцией main():
inttemp; main()Здесь переменная temp определена как внешняя, так что с ней могут работать все функции, содержащиеся в программе. Посмотрите на текст программы, приведенный в Листинге 3. Переменная temp является внешней и ее используют функции main(), convert(), freeze() и boil(). Значение переменной, введенное в main(), используется при расчетах другими функциями. В программе присутствует еще одна переменная —celsius. Поскольку значение переменной celsius используется только функцией convert(), переменная определена внутри этой функции, являясь, таким образом, локальной переменной, которая не может использоваться нигде кроме convert().
Листинг 3. Программа, содержащая внешнюю переменную.
/*f_to_c.c*/int temp;main() { printf("Введите значение температуры: "); scanf("%d", &temp); convert(); freeze(); boil(); }convert() {floatcelsius; celsius = (5.0 / 9.0) * (temp - 32); printf("%d градусов по шкале Фаренгейта соответствует %6.2f градусам \ по шкале Цельсия\n", temp, celsius); return(0); }freeze() { printf("Это составляет %d градусовот точки замерзания воды\n", temp-32); return(0); }boil() { printf("Это составляет %d градусов от точки кипения воды\n", 212-temp); return(0); }Если в программе одновременно присутствуют внешняя и локальная переменные с одним и тем же именем, функция, в которой определена локальная переменная, будет иметь доступ только к ней и не сможет использовать внешнюю переменную.
Статические переменные
Автоматические (локальные) переменные существуют только во время выполнения функций, в которых они определены. В момент начала работы функции для такой переменной резервируется память. Когда выполнение функции заканчивается, зарезервированная область памяти освобождается и переменная прекращает свое существование.
Если функция вызывается неоднократно, локальные переменные создаются столько раз, сколько вызовов данной функции имеется в программе, поэтому адреса этих переменных могут все время меняться. Соответственно, и значения локальных переменных, хранящиеся в памяти, теряются каждый раз при завершении работы функции.
Тем не менее, значение, присвоенное переменной, можно сохранить в памяти и после окончания выполнения функции, если определить эту переменную как статическую. Это делается следующим образом:
Адреса хранения статических переменных остаются неизменными на протяжении всего времени выполнения программы. После прекращения работы функции память, закрепленная за переменной, не освобождается, поэтому и записанное в ней значение переменной сохраняется. При следующем вызове этой же функции переменная будет иметь значение, оставшееся от предыдущего вызова. Запомните, что переменная при этом остается локальной и имеет смысл только внутри своей функции.
Для того чтобы пояснить, что такое статическая переменная, рассмотрим следующий пример. Посмотрите на программу, приведенную в Листинге 4. Вэтом фрагменте статические переменные не используются. Функция doit() вызывается четырежды, и каждый раз при этом двум переменным присваивается начальное значение 0, которое отображается с помощью функции printf(). Впроцессе работы функции, значение каждой переменной увеличивается на единицу. Однако значение переменных теряется после очередного завершения работы функции, а при следующем вызове им снова присваивается начальное значение0, так что результат работы программы выглядит так: