Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Книга_2013_1_часть+.doc
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
813.57 Кб
Скачать
    1. Формальные и фактические параметры

Параметры, записанные в скобках заголовка функции, назовём формальными параметрами (Len, y и ch). Параметры, записанные при вызове функции, назовём фактическими параметрами, или аргументами (LEN, Y, C). Между ними должно быть следующее соответствие:

    • в типе, с учётом их совместимости. Например, вместо параметра типа char можно передать не только символ, как показано в первом вызове, но и его код типа int, как показано во втором вызове (подробности в гл. 4). Вместо формального вещественного параметра можно передать целый, но не наоборот;

    • в порядке следования. Нарушение этого требования приведёт либо к ошибке компиляции, если типы фактических и формальных параметров несогласованны, либо повлияет на результат. Если в нашем примере вызвать функцию LINE2(“*”, 5, 20), то компилятор сообщает о невозможности преобразования char в int. Если же вызвать LINE2 (Y, LEN, ‘-‘), то в строке LEN будет выведено Y символов “-“;

    • в количестве параметров. Количество параметров при вызове должно быть таким, как в прототипе и в заголовке перед текстом функции. Поэтому если в процессе отладки программы добавили или удалили один или несколько параметров функции, то это надо не забыть сделать в трёх местах: в прототипе, перед текстом функции и при вызове. Заметим, что это требование справедливо, если не используются параметры по умолчанию (см. §6).

    1. Передача параметров по значению

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

  • для фактического и формального параметров компилятор отводит разные ячейки памяти;

  • при выполнении программы содержимое каждого аргумента копируется в ячейку для соответствующего формального параметра, то есть при первом вызове в нашем примере выполняется Len=20, y=5 и ch=’*’ , хотя это явно нигде не записывается;

  • из первой особенности следует, что если в функции изменить формальный параметр, то это изменение не повлияет на значение переменной, используемой при вызове, то есть фактического параметра. Если бы в функции изменили y (например, там было бы записано y++), то значение соответствующей переменной Y в головной функции после второго вызова осталось бы без изменения, т. е. тем, что ввели;

  • в качестве фактического параметра, соответствующего параметрузначению, может быть выражение соответствующего или совместимого типа. Например, функцию можно вызвать так: LINE2 ( LEN*2, Y+1, ‘*’);. Как частный случай можно передавать константу, как показано при первом вызове, или переменную (см. второй вызов). При этом её имя, используемое при вызове, не обязательно должно отличаться, как в нашем примере, от имени формального параметра. В головной программе переменную для фактической длины символов можно было бы тоже назвать Len. Но и в этом случае для Len в main и для Len в функции Line2 компилятор резервирует разные ячейки памяти.