Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Мет-каС++.doc
Скачиваний:
18
Добавлен:
31.05.2015
Размер:
734.21 Кб
Скачать

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

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

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

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

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

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

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

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

Пример функции, в которой меняются местами значения аргументов x и y:

void z1(int *x, int *y)

{ int t;

t=*x;

*x=*y;

*y=t;

}

Участок программы с обращением к данной функции :

int a=2, b=3;

void z1(int*, int*);

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

z1(&a, &b);

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

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

a=2, b=3

a=3, b=2

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

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

fac(int n)

{

int b;

if (n= =1) return 1;

b=fac(n-1)*n;

return n;

}

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

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

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

В заключении рассмотрим передачу в функции одномерных и двумерных массивов.

Передача одномерного массива:

void main (void)

{

int vec [20];

fun(vec);

}

void fun(vec_pav)

int vec_pav [ ];

{

}

Передача двумерного массива:

void main(void)

{

static int mos [2][3]={{1,2,3}, {4,5,6}};

fun (mos);

}

void fun(mos_per)

{

int_mos_per [ ][3];

…..

}