- •Тема 5. Функции Функции
- •Объявление и определение функций
- •[Класс] тип имя ([список_параметров]);
- •Void main()
- •Void main()
- •Параметры функции
- •Void f(int , int* , int& );
- •Int main()
- •Void f(int I, int* j, int& k)
- •Передача массивов в функции
- •Передача многомерных массивов в функции
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •Int main (int argc, char *argv[], char *argp[])
- •Int main ( int argc, char *argv[], char *argp[])
Параметры функции
Использование параметров является основным способом обмена информацией между вызываемой и вызывающей функциями. Параметры, перечисленные в заголовке описания функции, называются формальными, а записанные в операторе вызова функции — фактическими.
При вызове функции в первую очередь вычисляются выражения, стоящие на месте фактических параметров; затем в стеке выделяется память под формальные параметры функции в соответствии с их типом, и каждому из них присваивается значение соответствующего фактического параметра. При этом проверяется соответствие типов и при необходимости выполняются их преобразования. При несоответствии типов выдается диагностическое сообщение. Существует два способа передачи параметров в функцию:
по значению
по адресу.
Синтаксис при вызове и передаче параметров по значению:
имя (факт_параметр1, факт_параметр2 …);
Синтаксис при определении и объявлении:
тип имя (тип форм_параметр1, тип форм_параметр2 …);
При передаче по значению в стек заносятся копии значений фактических параметров, и операторы функции работают с этими копиями. Доступа к исходным значениям параметров у функции нет, и поэтому при изменении формальных параметров фактические параметры не изменяются.
При передаче параметров по адресу используется 2 синтаксиса:
а) с помощью ссылки
при вызове:
имя (факт_параметр1, факт_параметр2 …);
при определении и объявлении:
тип имя (тип &форм_параметр1, тип &форм_параметр2…);
б) с помощью указателя
при вызове:
имя (&факт_параметр1, &факт_параметр2…);
при определении и объявлении:
тип имя (тип *форм_параметр1, тип *форм_параметр2…);
При передаче по адресу в память заносятся копии адресов фактич. параметров, а функция осуществляет доступ к ячейкам памяти по этим адресам, т.е. при изменении значений формальных параметров значения фактических параметров также изменяется.
При передаче по адресу в качестве фактических параметров нельзя использовать выражения, а только имена переменных.
Способы передачи параметров в функцию могут комбинироваться.
#include <iostream.h>
#include <conio.h>
#define out cout << i <<" "<< j <<" "<< k <<"\n";
Void f(int , int* , int& );
Int main()
{
int i = 1, j = 2, k= 3;
cout <<"i j k\n";
out
f(i, &j, k);
out
getche();
return 0;}
Void f(int I, int* j, int& k)
{
i++; (*j)++; k++;
}
Первый параметр (i) передается по значению. Его изменение в функции не влияет на исходное значение. Второй параметр (j) передается по адресу с помощью указателя, при этом для передачи в функцию адреса фактического параметра используется операция взятия адреса, а для получения его значения в функции требуется операция разыменования. Третий параметр (k) передается по адресу с помощью ссылки.
Использование ссылок вместо указателей улучшает читаемость программы, избавляя от необходимости применять операции получения адреса и разыменования. Использование ссылок вместо передачи по значению более эффективно, поскольку не требует копирования параметров, что имеет значение при передаче структур данных большого объема.
