Локальные и глобальные переменные

Лекция №12. ПАРАМЕТРЫ ФУНКЦИЙ

Понятие о параметрах функций

Для вызова функции типа void достаточно просто написать ее имя в нужном месте программы или другой функции, а на место формальных параметров поставить фактические.

Формальными называются параметры, находящиеся в скобках, при объявлении прототипа функции и при ее определении, а фактическими - параметры, подставляемые на место формальных при вызове функции.

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

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

Все функции, которые возвращают значения, должны содержать, по крайней мере, один оператор return, за которым следует возвращаемое зна­чение объявленного типа.

Функции также могут возвращать значения строкового типа и указатели.

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

Переменные, объявленные внутри функций, являются локальными по отношению к этим функциям; переменные, объявленные вне функций, включая main(), - глобальными.

Локальные переменные запоминаются в стеке вместе с адресами возврата из функции. Стек динамически изменяется по мере того, как операторы вызывают функции и происходит возврат из них.

Локальные переменные также называются автоматическими переменными, так как они создаются и разрушаются программами автоматически.

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

1) большее по сравнению с доступной памятью суммарное пространство, занимаемое всеми локальными переменными;

2) бесконфликтное объявление одинаковых идентификаторов для локальных переменных, используемых в различных функциях одной программы.

В языке С допустимо объявление локальных переменных непосредственно в операторном блоке:

if (условие) { int i;}

Переменная i будет занимать место в памяти только в том случае, если условие оператора if окажется истинным, а область ее действия будет распространяться до закрывающей фигурной скобки оператора if.

Чаще всего объявляют локальные переменные цикла с параметром:

for (int cnt=0; cnt<100; cnt++) {/*тело цикла*/}

Локальная переменная цикла cnt существует в памяти ЭВМ, пока выполняется тело цикла.

Глобальные переменные существуют в течение всего времени работы программы. Они запоминаются в сегменте данных программы и занимают память независимо от того, нужны они или нет.

В C++ существуют регистровые переменные, которые запоминаются непосредственно в регистрах процессора. Для объявления таких переменных используют спецификатор памяти register. Регистровые переменные бывают только локальными. Регистровые переменные ускоряют работу программы, поэтому чаще всего их используют для объявления управляющих переменных циклов. Объявление регистровой переменной имеет вид: register int Var_Reg;