Область действия переменных

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

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

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

В языке С каждая переменная принадлежит к одному из четырех классов памяти – автоматическая (auto), внешняя (extern), статическая (static), регистровая (register). Тип памяти указывается ключевым словом (auto, extern, static, register), стоящим перед спецификацией типа переменной. Например, register int a;

По умолчанию переменная относится к классу auto и будет размещена в стеке.

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

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

Фрагмент программы, использующей функцию, в которой меняются местами значения аргументов x и y:

...

void z1(int*, int*); // Описание прототипа

void main()

{ int a=2, b=3;

printf(“\n a=%d, b=%d”, a, b);

z1(&a, &b); // Обращение к функции

printf(“\n a = %d, b = %d”, a, b);

}

void z1(int *x, int*y) // Описание (реализация) функции

{

int t;

t = *x;

*x = *y;

*y = t;

return;

}

При таком способе передачи аргументов их значения будут изменены, т.е. на экран монитора будет выведено:

a = 2, b = 3

a = 3, b = 2

В языке С функции могут вызывать сами себя. В этом случае функция называется рекурсивной.

Пример рекурсивной функции – вычисление факториала числа n!=1*2*3*…*n:

int fac (int n)

{

int b;

if (n= =1) return 1;

b= fac (n-1)*n;

return n;

}

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

На функцию, как и на другой объект, можно создать указатель, например, указатель р на функцию, возвращающую значение типа type и имеющую параметры типа type1 t, type2 z, объявляется следующим образом:

type (*p)(type1 t1, type2 t2);


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: