Обмен данными между функциями происходит при вызове функции из какой-либо другой функции. При этом в языке существуют 2 способа передачи данных.
1. Передача по значению.
2. Передача данных по адресу.
Передача данных по значению и выполнение вызова функции происходят следующим образом.
1. Вычисляются выражения в списке фактических аргументов в соответствии с приоритетами операций, в результате получаются числовые значения фактических аргументов. Затем, если известен прототип функции, то тип полученного фактического аргумента сравнивается с типом соответствующего формального аргумента. Если они не совпадают, то либо производится преобразование типов, либо формируется сообщение об ошибке. Число выражений в списке фактических аргументов должно совпадать с числом формальных аргументов, если только функция не имеет переменного числа аргументов.
2. Происходит присваивание значений фактических аргументов соответствующим формальным аргументам.
3. Управление передается на первый оператор функции и выполняется тело функции.
4. Выполнение оператора return в теле функции возвращает управление и значение в вызывающую функцию. При отсутствии оператора return управление возвращается после выполнения последнего оператора тела функции, а возвращаемое значение не определено.
Передача данных по адресу выполняется иначе. Имя функции, стоящее перед скобками, определяет адрес вызываемой функции. Это значит, что вызов функции и передача в неё данных может быть реализованы через указатель на функцию.
int (*fun)(int x, int *y);
Объявлена переменная fun как указатель (имя указателя fun) на функцию с двумя аргументами: типа int (аргумент х) и указателем на int (имя указателя) y. Сама функция должна возвращать значение типа int. Круглые скобки, содержащие имя указателя fun и признак указателя *, обязательны, иначе запись
int *fun (int x,int *y); будет интерпретироваться как объявление функции fun, возвращающей указатель на int.
Вызов функции возможен только после инициализации значения указателя fun и имеет вид: (*fun)(i,&j);
В этом выражении для получения адреса функции, на которую ссылается указатель fun используется операция разадресации * .
Указатель на функцию может быть передан в качестве аргумента функции. При этом разадресация происходит во время вызова функции, на которую ссылается указатель на функцию. Указателю на функцию можно присвоить значение в операторе присваивания, употребив имя функции без списка аргументов.
highlightSyntax('cpp_20395','cpp');