> For the complete documentation index, see [llms.txt](https://op-al.gitbook.io/s-30-voprosy-i-dop.-voprosy/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://op-al.gitbook.io/s-30-voprosy-i-dop.-voprosy/21.-funkcii-svyaz-s-matematicheskimi-funkciyami.-instrukciya-return.-vyzov-funkcii..md).

# 21.	Функции, связь с математическими функциями. Инструкция return. Вызов функции.

Объявление и определение функции. Кадр стека, назначение, что в нем содержится

**Функция** — это самостоятельная единица программы, которая спроектирована для реализации конкретной подзадачи.

### Оператор возврата return <a href="#operator-vozvrata-return" id="operator-vozvrata-return"></a>

Является завершающим оператором программы. Состоит из ключевого слова return, за котором следует возвращаемое значение (тип данных которого соответствует возвращаемому типу функции, указанному в заголовке) и точка с запятой.

### Работа с функциями <a href="#rabota-s-funkciyami" id="rabota-s-funkciyami"></a>

#### Объявление функции (прототип): <a href="#obyavlenie-funkcii-prototip" id="obyavlenie-funkcii-prototip"></a>

`<тип возвращаемого значения> имя_функции (<тип аргумента> имя_аргумента)int function (char *, int)` имя аргумента не обязательно

#### Определение функции: <a href="#opredelenie-funkcii" id="opredelenie-funkcii"></a>

<тип возвращаемого значения> имя\_функции (<тип аргумента> имя\_аргумента){Тело функции}​int function (char \*s, int n){n = strlen(s);printf(“Длина: %d”, n);return n;}

#### Вызов функции: <a href="#vyzov-funkcii" id="vyzov-funkcii"></a>

`имя_функции (имя_аргумента)function (s, n);`

### Кадр стека <a href="#kadr-steka" id="kadr-steka"></a>

Как только мы вызываем функцию, в стеке для неё создается стековый кадр, который содержит локальные переменные, а также аргументы, которые были переданы вызывающей функцией. На выходе из функции стековый кадр очищается.

### Сегмент стека

* Процессор выполняет каждую функцию как отдельную задачу. Для обмена данными между функциями используется специально выделяемая область памяти называемая сегментом стека.
* &#x20;Запись и чтение данных в стек осуществляется в соответствии с принципом LIFO (Last In First Out — “последним пришел, первым ушел”). У процессора есть регистр SS (сегмент стека), который содержит адрес этой области памяти. Сегмент стека заполняется начиная со старших адресов к младшим. Вызывающая функция передает данные вызываемой через список параметров и они записываются в сегмент стека начиная с последнего параметра. Таким образом первый параметр оказывается в вершине стека (имеет самый младший адрес).&#x20;
* Адрес вершины стека хранится в регистре SP (stack pointer, указатель стека) и вызываемая функция по этому адресу получает доступ к переданным ей данным. Вызываемая функция работает с копиями данных вызывающей функции. Поэтому изменение данных вызываемой функцией не приводит к изменению данных вызывающей (происходит передача данных по значению). Вызываемая функция возвращает результат работы используя инструкцию return.
