- •Тема 6. Структуры
- •6.1 Понятие структуры в языке Си
- •6.2 Объявление типа структуры
- •6.3 Декларация переменных структурного типа
- •6.4 Доступ к элементам структурной переменной
- •6.5 Массивы структур
- •6.6 Оператор sizeof
- •6.7 Декларация typedef
- •7.2 Определение функции
- •7.3 Функции, вызывающие, I функции, вызываемые
- •7.4 Связи по данным между функциями
- •7.4.1 Вызов функции
- •7.4.2 Инструкция return (возврат)
- •7.5 Аппарат формальных и фактических аргументов
- •Входные аргументы;
- •Выходные аргументы;
- •Аргументы, которые обновляются.
- •7.6 Прототип функции
- •Тема 8. Передача аргументов функций
- •8.1 Способы передачи аргументов
- •8.1.1 Передача аргументов по значению
- •8.1.2 Передача аргументов по имени
- •8.1.3 Передача аргументов по ссылке
- •8.2 Особенности передачи аргументов в языке Си
- •8.3 Особые случаи передачи аргументов
- •8.3.1 Передача аргументом одномерного массива
- •Пример 6: сумма елеметiв массива (вариант 1).
- •Пример 7: сумма елеметiв массива (вариант 2).
- •8.3.2 Передача аргументом многомерного массива
- •8.3.3 Передача аргументом структуры
- •8.4 Аргументы командной строки
7.5 Аппарат формальных и фактических аргументов
Формальные аргументы - это объекты программы, в терминах которых описано тело в описании функции.
Фактические аргументы - это те объекты программы, которые ставятся в соответствие формальным аргументам в вызове функции.
Окончательно синтаксис объявления (описания) функции:
<Тип результата> <имя функции> ([<декларации формальных аргументов>])
{<Декларации>
<Тело функции>
}
Окончательно синтаксис вызова функции:
<Имя функции> ([<список фактических аргументов>])
Пример 4: Определим функцию для нахождения максимального значения
среди двух цiлочисельних значений (a, b) ; имя функции - max_int
INT max_int (int a, int b)
{
return (a> b)? a: b;
}
main ()
{Int x, y, z;
int m1, m2;
scanf ("% d% d% d", & x, & y, & z);
/ * Max среди x, y, z * /
m1 = max_int (x, y);
m2 = max_int (m1, z);
printf ("\ n max (% d,% d,% d) =% d", x, y, z, m2);
}
Выполним классификацию аргументов функций из этого примера:
имя функции | формальные аргументы | фактические аргументы
_____________|___________________________________________________________
main | - | -
_____________|______________________|____________________________________
printf | в библиотеке <stdio.h> | "\ n max (% d,% d,% d) =% d", x, y, z, m2
_____________|______________________|____________________________________
scanf | в библиотеке <stdio.h> | "% d% d% d", & x, & y, & z
_____________|______________________|____________________________________
max_int | a, b | x, y
| | M1, z
_____________|______________________|____________________________________
Аргументы функций также разделяют на:
-
Входные аргументы;
-
Выходные аргументы;
-
Аргументы, которые обновляются.
Входные аргументы використуються у функции для формирования результатов, они не должны изменяться в ходе выполнения тела функции.
Выходные аргументы формируются в функции на основе входных аргументов, они изменяются во ходе выполнения тела функции.
Аргументы, обновляются выполняет роль входных I выходных аргументов одновременно: використуються в функции для формирования результатов, меняются в ходе выполнения тела функции, они формируются в функции.
Выполним классификацию аргументов функциям по примеру 4 по признаку входные аргументы / выходные аргументы / аргументы, которые обновляются.
имя функции | входные аргументы | выходные аргументы | аргументы,
| | | Которые обновляются
_____________|_________________|__________________|_________________
max_int | a, b | - | -
_____________|_________________|__________________|_________________
printf | "\ n max (% d,% d,% d) | - | -
| =% D ", x, y, z, m2 | |
_____________|_________________|__________________|_________________
scanf | "% d% d% d" | & x, & y, & z | -
_____________|_________________|__________________|_________________
7.6 Прототип функции
Потому что функции в языке Си независимые друг от друга (на различие от языка Паскаль, где они могут быть вложенные друг в друга), функции, что вызывает нужна информация по то, что в ней будут использованы вызовы других функций. Это выполняется с помощью Инструкции описания прототипа функции .
Синтаксис:
<Тип результата> <имя функции> ();
или более "жесткий" вариант:
<Тип результата> <имя функции> (<декларации типов аргументов>);
Поэтому в примере 4 в функции main необходима декларация:
INT max_int (int, int); / * 1 * /
Она сообщает, что в функции main Ожидается вызов функции max_int с двумя цiлочисельнимы аргументами, которая возвращает результат целого типа.
Этот прототип также можно записать иначе:
INT max_int (); / * 2 * /
INT max_int (int a, int b); / * 3 * /
Третий вариант iлюструе главный принцип прототипа функции - имена аргументов, указанi в прототипi, не обвьязково должны спiвпадаты с именами формальных аргументов в описании функции.