Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по информатике.doc
Скачиваний:
118
Добавлен:
02.05.2014
Размер:
1.53 Mб
Скачать

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

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

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

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

myfunc()

{

staticintcount;

}

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

Передача параметров по значению

Когда параметр передается в функцию, по умолчанию используется техника, известная как передача параметра по значению, при которой функция обеспечивается копией значения параметра. При передаче параметра по значению любые изменения, выполняемые в функции над значением данного параметра, существуют только внутри самой функции. Когда функция завершается, значение переменной, переданной по значению, оказывается не измененным. Например, в следующей программе функции display_and_change передаются три параметра (переменные a, b и с):

#include <stdio.h>

void display_and_change(int first, int second, int third)

{

printf("Начальные значения функции %d%d%d\n",

first, second, third);

first += 100;

second +=100;

third+= 100;

printf("Конечные значения функции %d%d%d\n",

first, second, third);

}

void main(void)

{

int a=l, b=2, с = 3;

display_and_change(a, b, c);

printf("Конечные значенияmain%d%d%d\n",a,b,c);

}

После компиляции и выполнения программы на экран выводится:

C:\>NOCHANGE<ЕNTER>

Начальные значения функции 123

Конечные значения функции 101 102 103

Конечные значения main123

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

При передаче параметров в функцию их значения размещаются в стеке. Для случая переменных a, b и с в стеке будут содержаться значения 1,2 и 3 соответственно. Любые изменения, выполняемые в функции над значениями параметров, в действительности изменяют значения ячеек стека.

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