- •1.2 Функции пользователя
- •1.2.1 Общие моменты
- •1.2.2 Изменение переменных в функции из других функций
- •1.2.3 Рекурсивные вызовы функций
- •1.2.4 Функции с переменным количеством параметров
- •1.2.5 Перегрузка функций
- •1.2.6 Передача функций в качестве параметров
- •1.3 Структуры
- •1.4 Битовые поля
- •1.5 Объединения
- •2 Оператор описания типа
- •3 Оператор описания объекта
- •3.1 Классы памяти
- •4 Преобразование типов
- •4.2.1 Неявные преобразования
- •4.2.2 Явные преобразования
- •5 Директивы препроцессора языка си
1.2 Функции пользователя
1.2.1 Общие моменты
Функция – это независимая совокупность объявлений и операторов, предназначенная для выполнения определенной задачи.
В отличие от других языков программирования высокого уровня в языке Си нет деления на процедуры, подпрограммы и функции. В Си программа строится только из функций.
Функции можно разделить на две категории: функции, возвращающие значения, и функции, не возвращающие значения в вызывающую программу.
С использованием функций в языке Си связаны три понятия: определение функции, объявление функции, и вызов функции.
Определение функции задает ее заголовок, объявления локальных объектов (констант, переменных) и операторы, которые определяют действие функции. Тело функции заключается в фигурные скобки.
Определение функции возвращающей значение:
[static] тип_возвращаемого_результата имя_функции (описания формальных параметров)
{
Тело функции
return возвращаемый результат;
}
Возврат результата из функции осуществляется при помощи оператора return. С помощью return можно вернуть только одно значение.
В качестве результата функция не может вернуть массив или функцию, может вернуть указатель на массив или функцию.
Тип функции возвращающей значение должен совпадать с типом возвращаемого из нее значения.
Каждый формальный параметр должен быть специфицирован, т.е. для него задается тип данных, даже при совпадении типов.
Класс памяти по умолчанию static.
Пример:
int max(int a, int b)
{
int r
r=(a>b) ? a : b;
return r;
}
Определение функции, не возвращающей значение:
[static] void имя_функции (описания формальных параметров)
{
Тело функции
}
Пример:
void swap(int *a, int *b)
{
int temp;
temp=*a;
*a=*b;
*b=temp;
}
Объявление, описание или прототип функции задает ее имя, типы и число формальных параметров, тип значения, возвращаемого функцией, и класс памяти. В объявлении формальные параметры могут иметь имена, однако это не является необходимым. Объявление оканчивается символом ‘;’.
Прототип для функции возвращающей значение:
[static/ extern] тип_результата имя функции();
Прототип для функции не возвращающей значение:
[static/ extern] void имя функции();
Если в описании функции не указан класс памяти, то, по умолчанию, предполагается класс extern.
Вызов функции
имя_функции (список фактических параметров);
Формальные и фактические параметры:
Формальные параметры – это фактически шаблоны, под которые в действительности не выделяется память, в момент определения функции.
Фактические параметры – это те, которые передаются из вызывающей программы в функцию по значению (т.е. они существуют, под них выделено место в памяти). Т.е. вычисляется значение каждого выражения, представляющего аргумент, и именно это значение используется в теле функции вместо соответствующего формального параметра.
Требования к фактическим и формальным параметрам:
Они должны совпадать по:
количеству;
по порядку следования;
по типу данных.
Правила описания функций:
Описание функции нужно размещать до места вызова этой функции.
Определение и описание функции не может размещаться в теле другой функции.
Примеры:
int max(int a, int b)
{
int r
r=(a>b) ? a : b;
return r;
}
main()
{
int a,s,l;
a=3;s=2;
l=max(a, s);
printf(“%d”,l);
}
или
Примеры
int max(int a, int b);
main()
{
int a,s,l;
a=3; s=2;
l=max(a, s);
printf(“%d”,l);
}
int max(int a, int b)
{
int r;
r=(a>b) ? a : b;
return r;
}
Процедура вызова функции
void main()
{
int x, y, z;
x=1;
y=2;
z=fun(x,y);
}
int fun(int x, int y)
{
int p;
p=x+y;
return p;
}