Обмен данными между функциями через внешние переменные.
Внешняя переменная доступна из любой части программы, в том числе из другой функции. Использование внешних переменных делает функцию не универсальной, она теряет свою независимость, а это основные свойства функций. При широком использовании внешних переменных затруднена отладка программы, поскольку неизвестно какая именно функции изменила внешнюю переменную.
Использование свойств статистических переменных при написании функции.
Статистическая переменная, объявленая внутри функции, является локальной, но она живет и сохраняет свое значение во время выполнения всей программы, следовательно, вызывая функцию во второй раз, мы можем пользоваться значением статистической переменной полученной в предыдущий раз.
Пример:
#include<iostream> //подключение системных средств для
using namespace std; //возможности использовать потоки ввода-вывода
void func (void);
void main (void)
{
int i;
for(i=0;i<5;i++)
func ();
return;
}
void func(void)
{
int a=0;
static int b=0;
cout<<a<<endl<<b<<endl; //а равна всегда 0, b растет на 1
a++;
b++;
return;
}
Способы передачи данных в функцию
Данные в функции передаютсяпо значению, адресу или ссылке.
При передачи по значению исходные данные из функции main заносятся в параметры функции. Функция производит действия над параметрами, а, следовательно, над копиями исходных данных, передаваемых из функции main. Следовательно, изнутри мы не можем изменить исходные данные. Обратной связи нет.
Передача данных по адресу.
Адрес – уникальная и однозначная характеристика данного. Зная адрес данного, можно извлечь данное по адресу или изменить данное по адресу. В функцию через параметр мы можем передать адрес данного, объявленного в функции main. Внутри функции мы можем извлечь данное по адресу или изменить данное по адресу. Этот механизм используется для передачи из функции результатов, если их больше чем один.
Данное, переданное по адресу, можно использовать внутри функции и изменять.
Вывод: Данное, переданное по значению, оказывается защищенным от изменений внутри функции. Если данные не должны быть изменены, они должны передаваться по значению. Если данные хотим изменить внутри функции, они передаются по адресу (например, передача двух и более результатов из функции).
Механизм передачи второго, третьего ……. Результата из функции.
Пусть из функции необходимо предать через параметры результат целого типа.
Необходимо:
· Объявить в функции main переменную целого типа под результат.
· В функции main в операторе вызова этой функции в качестве соответствующего аргумента передать адрес объявленной переменной.
· В имени функции и в прототипе объявить параметр указатель на целый тип.
· Внутри функции вычислить результат и записать его значение по указанному в параметре адресу.
То же самое схематично:
# include…..
void func (…, int*p);
void main (void)
{……………………….
Int res; //переменная целого типа под результат.
…………………………
…………………………
… func (…, & res); // передали в функцию адрес переменной res.
Printf (“res=%d\n”, res); //вывели полученный из функции результат
}
… funs (…, int*p)
{……………………….
Int res; //объявили переменную под результат
……………………….
Res=…; //вычислили результат
*p=res; // возвратили результат функции через параметр
return…;
}
Передавая адрес аргумента мы открываем из функции прямой доступ к аргументу, экономя при этом память.
Запретить изменение аргумента, при передаче адреса можно, для этого надо объявить параметр const int *p;