Wait(12)

Else

return b;

}

Передача аргументов в функцию

Количество аргументов и их типы должны совпадать со списком параметров в прототипе и заголовке функции. Например, если объявлено, что функция принимает 2 аргумента типа int, то в неё следует передавать именно 2 аргумента типа int. Каждый аргумент может быть любым выражением на языке С: константой, переменной, арифметическим или логическим выражением или даже вызовом другой функции.

 

Вызов функции можно осуществить двумя способами:

  1. назвав её по имени со списком аргументов
  1. указав функцию в выражении

printf(“Half of%d is %d”, x, half_of(x))

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

  1. имя_функции(a1, a2, …, an) т.е. указывается имя функции, а в () перечисляются её фактические параметры.
  2. (*указатель_ на_функцию) (a1, a2, …, an)

Указатель_ на_функцию это переменная, содержащая адрес функции. Адрес функции в переменную может быть присвоен с помощью конструкции:

указатель_ на_функцию=имя_функции

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

 

Пример: функция, которая меняет значение двух заданных переменных целого типа a и b.

void swap(a,b)

int *a, *b;

{

int z;

z=*a;

*a=*b;

*b=z;

}

Если в программе потребуется поменять значениями x и y, то обращаться к функции надо следующим образом swap(&x, &y) и результат возвратиться в основную программу.

 

Классы переменных

 

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

extern <имя><имя переменной>

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

· автоматические,

· регистровые,

· статические.

 

Локальные переменные, определяемые обычным образом являются автоматическими. Они являются временными. Автоматические переменные имеют приоритет перед глобальными переменными, т.е. если Х-глобальная и х-локалная переменные определены в некотором блоке, то внутри этого блока х-будет использоваться как локальная переменная.

 

Переменные называются регистровыми если описаны в блоке так:

registers int<список переменных>

они также временные, но для хранения их значений компилятор пытается отвести внутренние регистры. Использование регистров позволяет значительно ускорить доступ к значению переменных т.к. эти значения будут размещаться в регистрах, а не в ячейках памяти. Однако т.к. число регистров не велико и обычно ограничивается 10-20 в зависимости от типа ЭВМ. Т.о. число регистровых переменных может быть небольшим. Взять адрес у регистровых переменных нельзя.

 

Статические переменные определяются следующим образом:

static<тип><список переменных>

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

 

Описание внешних объектов

 

Программа на языке С может состоять и одного или нескольких файлов. Каждый из указанных файлов может транслироваться и отлаживаться не зависимо от других. Затем программа собирается в единое целое с помощью редактора внешних связей(компановщик). Объекты, которые определены в одном из файлов, но используются и в других должны быть определены в других как внешние. Для этого используется ключевое слово extern, которое должно стоять перед описанием имени внешнего объекта по отношению к заданному файлу.

extern int g1, g2;

extern double funct() – это определение внешней функции

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