
2 Функции
Это элементи програми, используемые неоднократно для выполнения определенных действий (вычислений, обмена данными и т.д.). Каждая программа содержит одну главную функцию main(), либо функцию main() и любое количество других функций.
Всем именам функций по умолчанию присваивается класс памяти extern, т.е. функции глобальны, имеют внешний вид компоновки, статическую продолжительность существования (до конца выполнения программы) и доступны при определенных условиях во всех модулях программы.
Любая функция, кроме главной функции main(), должна быть определена или описана до её использования (вызова) в конкретном модуле. Определение функции имеет следующий синтаксис:
тип_функции имя_функции(список_формальных_параметров)
{ тело функции }
Первая строка функции называется заголовком функции:
Тип_функции – это тип возвращаемого функцией значения. Если функция ничего не возвращает, то тип функции обозначается void.
Имя_функции – это любой уникальный идентификатор.
Список_формальных_параметров (или сигнатура функции) – это пусто или void, если в функцию не передаются параметры, либо список спецификаций отдельных параметров с указанием типов и имен, записанных черех запятую.
Тело функции – это последовательность определений, описаний переменных и операторов, заключенных в фигурные скобки.
Когда функция вызывается, управление передается в начало тела функции. Возврат в точку вызова функции выполняется оператором return выражение или return.
Вызов функции (обращение к функции) – это выражение, в котором указывается имя функции и список фактических параметров в круглых скобках. Результатом этого выражения является возвращаемое значение, тип которого соответствует типу функции:
имя_функции(список фактических параметров)
где список_фактических_параметров – это либо пусто, либо void, либо фактические параметры (константы или заранее определенные переменные, переменные с преобразованием типов, выражения).
При обращении к функции формальные параметры заменяются фактическими параметрами в строгом соответствии с типами параметров. Соответствие между формальными и фактическими параметрами устанавливается по их взаимному расположению в списках.
Если функция определена после функции main() или в другом файле, то до первого обращения к функции она должна быть описана. Описание функции называется прототипом – это заголовок функции, конце которого обязательна точка с запятой. Прототип необходим для проверки соответствия типов и количества передаваемых в функцию параметров и типа возвращаемогозначения. В прототипе можно не указывать имена формальных параметров.
Все параметры функции (кроме указателей и массивов) передаются по значению, т.е. для передаваемых (фактических) параметров в функции создаются копии этих параметров, под которые в стеке выделяется память. Действия, производимые над этими копиями в теле функции, не влияют на переменные вне функции, т.е. на фактические переменные.
При передаче в функцию указателей (адресов фактических параметров) в функции создаются копии этих адресов, и в теле функции становится известно, где располагаются фактические параметры, и, следовательно, значения фактических параметров можно изменить, используя раыменование указателей..
Пример 2.1
int func1(int a, int b) |
{return a+b;} |
float sqr(float f, float g) |
{ return f*g;} |
|
int main() |
{int am=2, bm=3,res1, res4; |
res1=func1(am,bm); |
float em=2.5,gm=3.0,fm=4.2,res2,res3; |
res2= sqr(em,gm); |
res3= sqr(fm, sin(em)); |
res4=(int)sqr(em,float(am)); |
return 0;} |
|
|
|
|
Пример 2.2
#include <stdio.h> |
int sum(int, int); |
int main() |
{int a1,а2, b=3, g=4; |
a1=sum(b, g); |
а2=sum(20, g); |
printf("Сумма1=%d cумма2=%d \n", a1,a2); |
return 0;} |
int sum(int arg1, int arg2) |
{ return arg1+arg2;} |
|
|
Пример 2.3
#include <stdio.h> |
void swap(int *a, int *b) |
{printf("&a=%p a=%p *a=%d\n",&a,a,*a); |
printf("&b=%p b=%p *b=%d\n",&b,b,*b); |
int tmp=*a; |
*a=*b; *b=tmp; |
printf("*a_n=%d *b_n=%d\n",*a,*b);} |
void main() |
{int i=5,j=60; |
printf("&i=%p i=%d\n &j=%p j=%d\n",&i,i,&j,j); |
swap(&i,&j); |
printf("i=%d j=%d\n",i,j);} |
|
|
|