Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
PYaVU_s.doc
Скачиваний:
44
Добавлен:
24.02.2016
Размер:
665.09 Кб
Скачать
      1. Формальные параметры

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

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

После последнего идентификатора в списке параметров может появиться запятая с последующим многоточием (,...), это означает, что число аргументов функции переменно. Однако предполагается, что функция по крайней мере имеет столько аргументов, сколько следует идентификаторов перед последней запятой.

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

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

Идентификаторы формальных параметров используются в теле функции в качестве ссылок на величины передаваемые функции. Эти идентификаторы не могут быть использованы для переменных, объявляемых внутри тела функции. Если функция имеет переменное число аргументов, то программист отвечает и за определение их числа и за получение их из стека внутри тела функции. Смотрите документацию (MSDN) о макросах, которые могут быть использованы, чтобы обеспечить переносимость в этом случае.

Пример:

struct student

{

char name [20];

int id;

long class;

student *nextstu;

} student;

main ()

{

int match (student *, char *);

.

.

.

if (match(student.nexstu ,student.name)>0){

{

.

.

.

}

}

match (student r, char *n)

{

int i=0;

while (r->name [i] == n[i])

if (r->name [i++] == '\0')

return (r->id);

return (0);

}

В примере содержатся : объявление структурного типа, forward-объявление функции match, вызов match и определение функции match. Заметим, что одно и то же имя student может быть использовано без противоречий для тела структуры и имени структурной переменной.

Функция match объявлена с двумя аргументами. Первый аргумент - это указатель на структуру типа student, второй указа тель на объект типа char.

У функции match два формальных параметра z и n.

Параметр n объявлен как указатель на объект типа char.

Функция вызывается с двумя аргументами. Оба аргумента являются элементами переменной student структурного типа student.

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

Так как типы соответствуют, то в предупреждениях или преобразованиях нет необходимости.

Заметим, что имя массива, заданное в качестве второго аргумента в вызове функции преобразуется к указателю на char. Соответствующий формальный параметр также объявлен как указатель на char и используется в выражении как идентификатор массива. Так как идентификатор массива рассматривается как адресное выражение, то результат объявления формального параметра как char *n будет тем же самым, что и char n [].

Внутри функции локальная переменная i определяется и используется в качестве индекса массива. Функция возвращает структурный элемент id, если элемент структуры name сравнился с массивом n, в противном случае функция возвращает нуль.