1. Если некоторая функция возвращает некоторый результат (значение) в точку вызова, то в тексте функции должен обязательно быть оператор вида
return (выражение);
(круглые скобки здесь не обязательны).
Пример 5.1: Функция нахождения большего из двух чисел.
int max (int a, int b);
{
if (a > b)
return (a);
else
return (b);
}
Можно еще короче:
int max (int a, int b);
{
if (a > b) return (a);
return (b);
}
А можно использовать оператор “?”:
max (int a, int b);
{
return (a > b)? a : b ;
}
Если функция не возвращает никакого значения, она может также заканчиваться оператором return.
Отсутствие этого оператора не вызывает никаких неприятностей, т.к. при достижения закрывающей скобки ‘}’ компилятор автоматически генерирует код возврата.
2. Если требуется возврат в точку вызова до исполнения всех операторов тела функции в результате выполнения какого – либо условия. Например,
{
…
if (ch = =’\0’)
return 0;
…
}
Часто требуется, чтобы одна функция изменяла значения переменных, относящихся к другой функции. Предположим, что у нас имеются две переменные x и y, и мы хотим, чтобы они обменялись своими значениями. Схематически такой обмен представлен на рис 5.1.
2
X
Y
1 3
Рис.5.1
Для обмена двумя значениями вводится временная переменная temp, согласованная по типу с переменными x и y.
Последовательность операций здесь следующая:
temp = x;
x = y;
y = temp;
Рассмотрим программу, реализующую обмен конкретными значениями.
Пример 5.2. Программа обмен
#include <stdio.h>
void obmen( int, int); // Прототип функции
void main ( void)
{
int x = 5, int y = 20;
printf (“ x = %d y = %d”, x, y);
obmen ( x, y); // Вызов функции
printf (“После обмена : x = %d y = %d”, x, y);
}
// Описание функци
void obmen( int a, int b);
{
int temp;
temp = a;
a = b;
b = temp;
}
На входе программы a и b получили значения x и y, но на выход результат не передавался и значения внешних переменных x и y не изменились.
Результат работы программы будет выглядеть следующим образом:
x = 5 y = 20.
После обмена значениями: x = 5 y = 20, т.е. значения переменных не поменялись местами. Это произошло потому, что по правилам языка Си параметры функции являются параметрами - значениями. Это означает, что в момент обращения к функции, ей в качестве фактических параметров передаются не сами переменные, а их копии в виде значений, которые они имеют в данный момент.
Изменение значений локальных переменных a и b никак не сказывается на значениях x и y. Это совершенно различные переменные.
Каким же образом все - таки поменять значения переменных x и y в программе? Для этого следует использовать указатели. Почему? Потому что указатель – это адрес переменной, следовательно, используя указатель можно осуществлять доступ к самой переменной. Значение указателя и в вызывающей программе и в функции, которой это значение передано, указывает на одну и ту же переменную.
Как будет выглядеть правильная программа? Запишем ее.
Пример 5.3.
# include <stdio.h>
void obmen (int*, int*);
void main(void)
{
int x = 5, y = 20;
printf (…);
obmen (&x, &y); //адрес x, y = указателю на a и b.
printf (“ x = %d y = %d”, x, y);
}
void obmen (int*a, int*b)
{
int temp;
temp = *a; //разадресация, т.е. берется значение по адресу
*a = *b;
*b = temp;
}
Теперь программа будет работать правильно.
Декларация void obmen (int*, int*)
говорит о том, что в качестве аргументов в функцию obmen () следует передать указатели (адреса). Вот почему при вызове функции в качестве фактических параметров используют &x и &y, т.е.: