Вызов функции.
Вызов функции имеет следующий формат:
<имя_функции>(список_аргументов)
где в качестве аргументов можно использовать константы, переменные, выражения (их значения перед вызовом функции будут компилятором определены). Аргументы списка вызова должны полностью совпадать со списком параметров вызываемой функции по количеству, порядку следования и типам соответствующих им параметров. Отметим, что в случае отсутствия аргументов (в заголовке функции отсутствуют параметры) наличие круглых скобок у имени функции в точке ее вызова обязательно.
Связь между функциями осуществляется через аргументы и возвращаемые функциями значения. Ее можно осуществить также через внешние, глобальные переменные.
Функции могут располагаться в исходном файле в любом порядке. А сама исходная программа может размещаться в нескольких файлах. В языке Си аргументы при стандартном вызове функции передаются по значению, т.е. в стеке выделяется место для формальных параметров функции и в это выделенное место при ее вызове заносятся значения фактических аргументов. Затем функция использует и может изменять эти значения в стеке.
При выходе из функции измененные значения теряются. Вызванная функция не может изменить значения переменных, указанных как фактические аргументы при обращении к данной функции.
В языке С/С++ аргументы при стандартном вызове функции передаются по значению, т.е. в функцию передаются не оригиналы аргументов, а их копии. В стеке выделяется место для формальных параметров функции и в это выделенное место при ее вызове заносятся значения фактических аргументов. Затем функция использует и может изменять эти значения в стеке. Но при выходе из функции измененные значения теряются. Вызванная функция не может изменить значения переменных, указанных как фактические аргументы при обращении к данной функции.
Рис. 1. C++ размещает копии значений параметров во временном участке
памяти, называемом стеком
В случае необходимости функцию можно использовать для изменения передаваемых ей аргументов. В этом случае в качестве аргумента необходимо в вызываемую функцию передавать не значение переменной, а ее адрес. А для обращения к значению аргумента-оригинала использовать операцию «*».
Рис. 2. Передача параметров по адресу.
Пример функции, в которой меняются местами значения аргументов x и y:
void zam (int *x, int * y)
{
int t;
t = *x;
*x = y; *y = t;
}
Участок программы с обращением к данной функции:
void zam (int*, int*);
void main (void)
{
int a=2, b=3; …
cout<<" a = "<< a << " b = "<< b;
zam (&a, &b);
cout<<" a = "<< a << " b = "<< b;
…
}
При таком способе передачи аргументов в вызываемую функцию их значения будут изменены, т.е. на экран монитора будет выведено
a = 2, b=3
a = 3, b=2