Основным способом обмена информацией между вызываемой и вызывающей функциями являются механизм параметров. Существует два способа передачи параметров в функцию: по адресу и по значению.
При передаче по значению выполняются следующие действия:
● вычисляются значения выражений, стоящие на месте фактических параметров;
● в стеке выделяется память под формальные параметры функции;
● каждому фактическому параметру присваивается значение формального параметра, при этом проверяются соответствия типов и при необходимости выполняются их преобразования.
Например:
double square(double a, double b, double c) {
/*функция возвращает площадь треугольника, заданного длинами сторон а,b,c*/
sqrt(pow(x1-x2,2)+pow(y1-y2,2)),//расстояние между 1 и 2
sqrt(pow(x1-x3,2)+pow(y1-y3,2)),//расстояние между 1 и 3
sqrt(pow(x3-x2,2)+pow(y3-y2,2)));//расстояние между 2 и3
Таким образом, в память заносятся копии фактических параметров, и операторы функции работают с этими копиями. Доступа к самим фактическим параметрам у функции нет, следовательно, нет возможности их изменить.
При передаче по адресу в память заносятся копии адресов параметров, следовательно, у функции появляется доступ к ячейке памяти, в которой находится фактический параметр и она может его изменить.
Например:
void Change(int a,int b) { //передача по значению
int r=a; a=b; b=r;
}
int x=1,y=5;
Change(x,y);
cout << ”x=” << x << ”y=” << y;
выведется: x=1 y=5
void Change(int *a,int *b) { //передача по адресу
int r=*a; *a=*b; *b=r;
}
int x=1,y=5;
Change(&x,&y);
cout << ”x=” << x << ”y=” << y;
выведется: x=5 y=1
Для передачи по адресу также могут использоваться ссылки. При передаче по ссылке в функцию передается адрес указанного при вызове параметра, а внутри функции все обращения к параметру неявно разыменовываются.
void Change(int &a,int &b){
int r=a; a=b; b=r;
}
int x=1,y=5;
Change(x,y);
cout << ”x=” << x << ”y=” << y;
выведется: x=5 y=1
Использование ссылок вместо указателей улучшает читаемость программы, т.к. не надо применять операцию разыменовывания. Использование ссылок вместо передачи по значению также более эффективно, т.к. не требует копирования параметров. Если требуется запретить изменение параметра внутри функции, используется модификатор const. Рекомендуется ставить const перед всеми параметрами, изменение которых в функции не предусмотрено (по заголовку будет понятно, какие параметры в ней будут изменяться, а какие нет).
Пример 1. Для данных трех натуральных чисел найдите их НОД. Разработайте функцию нахождения НОД двух чисел.
#include <stdio.h>
long NOD (long x,long y);
void main (){
long a,b,c,z;
printf("Введите первое число = ");
scanf("%ld",&a);
printf("Введите второе число = ");
scanf("%ld",&b);
printf("Введите третье число = ");
scanf("%ld",&c);
z=NOD(c,NOD(a,b));
printf("Наибольший общий делитель 3 чисел равен %ld",z);