Обмен данными между функциями

Объявление и определение функций

Лекция №3

Тема: Функции в языке С/С++
ПЛАН 3.1 Объявление и определение функций 3.2 Обмен данными между функциями 3.3 Рекурсия 3.4 Перегрузка функций 3.5 Передача параметров функции main  
Время: 4 ч.
Литература: [4] с.73-88
       

Функция – это именованная последовательность операторов, выполняющая какое-либо законченное действие. Функция может получать параметры и возвращать единственное значение. Любая функция в программе должна быть объявлена и определена. Объявление функции должно быть сделано до ее вызова, чтобы компилятор мог правильно обработать ее параметры.

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

Формат определения функции:

тип имя_функции(список_параметров)

{тело функции

return значение}

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

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

В определении, в объявлении и при вызове одной и той же функции типы и порядок следования параметров должны совпадать.

Для вызова функции нужно указать ее имя, а за ним в круглых скобках – имена передаваемых аргументов (через запятую). Вызов функции может располагаться в любом месте программы. Исключение – функция типа void не может входить в состав выражений или располагаться в правой части оператора присваивания.

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

Примечание – Внутри функции нельзя описать другую функцию.

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

1) с помощью глобальных переменных;

2) через возвращаемое значение.

3) через параметры;

Глобальные переменные

Глобальные переменные доступны внутри любой функции, где нет одноименных локальных переменных. Но их использовать не рекомендуется, так как это затрудняет отладку и делает функцию зависимой от остальной программы (невозможность выделить функцию в отдельную библиотеку).

Возвращаемое значение

Возврат из функции в точку ее вызова осуществляется оператором:

return выражение;

В функции может быть несколько операторов return. Если функция описана как void, выражение не указывается (может даже отсутствовать и оператор return).

Выражение, указанное в операторе return неявно преобразуется к типу возвращаемого функцией значения и передается в точку вызова.

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

Параметры функции

Параметры, указанные в заголовке при описании функции являются формальными.

Параметры, заданные при вызове функции, называются фактическими (аргументами).

Способы передачи параметров в функцию:

1) по значению;

2) по адресу (по ссылке).

При передаче по значению функция получает копии значений параметров. Возможность изменить сами параметры отсутствует.

При передаче по адресу функция получает адреса аргументов. При этом функция может изменить значения аргументов. Если требуется запретить изменение параметра внутри функции, используется модификатор const.

Пример: Функция для обмена двух целых чисел.

#include <iostream.h>

void swap(int &x, int &y)

{

int z;

z=x;

x=y;

y=z;

}

void main()

{

int a=20,b=40;

cout<<"Значения до обмена"<<endl;

cout<<"a="<<a<<endl;

cout<<"b="<<b<<endl;

swap(a,b);

cout<<"Значения после обмена"<<endl;

cout<<"a="<<a<<endl;

cout<<"b="<<b<<endl;

}

Примечание – Аргумент может передаваться либо как указатель, либо как ссылка. При передаче по ссылке внутри функции при обращении к параметру неявно выполняется операция разыменования. При использовании указателя программист должен явно задавать операцию разыменования.

Передача массивов в качестве параметров

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

Примечание – Для многомерного массива в функцию нужно передать все его размерности. Внутри функции многомерный массив рассматривается как одномерный.

Пример: Функция вычисления суммы элементов одномерного массива:

#include <iostream.h>

#include <conio.h>

int sum(int x[],int n)

{

int i,s;

for (i=0,s=0;i<n;i++) s+=x[i];

return s;

}

void main()

{

int const n=10;

int x[n]={12,4,5,31,7,8,1,4,9,2};

clrscr();

cout<<"Сумма элементов="<<sum(x,n)<<endl;

}