Определение и оъявление функции

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

[класс памяти] typeID_function([список параметров]);

Тип функции – тип возвращаемого значения:

1. Тип может быть любым, кроме массива или функции, но может являться указателем на масив/функцию.

2. Если функция имеет тип void, это значит, что она ничего не возвращает (или не возвращает напрямую).

ID_fuction – имя функции.

Список параметров – список разделённых запятыми объявлений тех параметров, которые получает функция при вызове. Для каждого параметра указываетс ятип и имя.

Класс памяти – область видимости функции (по умолчанию – extern).

Любая функция должна быть:

1. Объявлена (написан её прототип)

2. Вызвана

3. Определена (описание самой функции)

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

При вызове (активации) функцииуказывается её имя и фактические параметры (значения, передающиеся в функцию при вызове). Фактические параметры заменяются формальными при выполнении операторов тела функции. Фактические и формальные параметры должны совпадать по типу и количеству.

Определение функции содержит объявление функции и тело функции. Тело функции – блок или составной оператор. В теле функции может находиться оператор return, который возвращает некоторое значение в точку вызова функции. Он имеет вид:
return [выражение];

Механизм передачи параметров в функцию

1. По адресу (с помошью указателей/ссылок)
В данном случае копия переменной не создаётся, имеем возможность непосредственно изменять значение локальных переменных.

2. По значению
Создаются копии переменных, с которыми работает функция. При выходе из функции копии уничтожаются.

При передаче параметров по значению выполняются следующие действия:

1. Вычисляются значения, стоящие на месте фактических параметров.

2. В стеке выделяется память под формальные параметры.

3. Каждому формальному параметру присваивается значение соответствующего фактического. При этом происходит проверка соответствия типов и количества передаваемых параметров.

Указатели и ссылки

Указатели

Указатель – переменная, в которой хранится адрес области памяти. Указатель не является самостоятельным типом.

Указатели делятся на два типа: указатели на переменные и указатели на функции.

Общий вид определения указателя:
type *ID_pointer;

Тип может быть любым, как пользовательским, так и встроенным.

ID_pointer – адрес (имя области памяти). Под адрес всегда выделяется место, как для целочисленного типа (обычно 4 байта).

*ID_pointer – содержимое адреса. Имеет такой же тип, как и переменная, на которую указывает указатель.

Основные операции над указателями:

1. Инициализация

a. С помощью операций получения адреса
&– операция получения адреса. Применима только к переменным (кроме регистровых), указателям и элементам массива.
int x=5;
int *p=&x;

b. С помощью уже проинициализированного указателя
int *p1=p;

c. С помощью задания явного адреса (16-ричная система счисления). Обязательно явное преобразование.
char *pc=(char*)0xB8000000;

d. Инициализация пустым значенем. Указатель может хранить либо адрес, либо 0.
double *p2=NULL;
double *p2=0;

Указатель обязательно должен быть проинициализирован адресом переменной.

2. Присваивание. Аналогично инициализации. Можно присвоить друг другу указатели разных типов, при этом требуется явное преобразование типа.

3. Чтение и запись по адресу.
* – унарная операция снятия адреса. Находится слева от знака присваивания – запись по данному адресу, справа – чтение с данного адреса.

4. Арифметические операции. Применяются только к указателям одного типа.

a. Инкремент/декремент – сдвиг по адресу на соседнюю ячейку.
int *pi;
(pi++)==(pi=pi+sizeof(int));

b. Разностьдвухуказателей: (p1-p2)/sizeof(type);
Сумма двух указателей недопустима.

c. Сумма указателя и целого числа: (pd+5)==(pd+5*sizeof(double));

5. Операция сравнения (только с указателями одного типа). При этом происходит сравнение адресов указателей.

Указатель void – содержит адрес некоторой переменной без информации о типе самой переменной. Чтобы просмотреть содержимое данного указателя, необходимо выполнить явное приведение типов.

Передача указателя в функцию: f(&x, &y);

Ссылки

Ссылка – скрытый указатель, является ещё одним именем переменной. Существую независимые (практически не используются) ссылки и ссылки как параметры функции.

Определение независимой ссылки:
type &ID_link=значение;

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

Правила работы со ссылками:

1. Ссылка обязательно должна быть проинициализирована при определении, если она не является параметром функции или не описана с помощью ключевого слова extern.

2. После инициализации ссылке нельза присвоить другое значение.

3. Операции над ссылкой приводят к изменению величины, на которую она ссылается.

4. Не существует указателей на ссылки, массивов ссылок или ссылок на ссылки.

5. Функция не может быть перегружена, если описания параметров отличаются только наличием ссылок.

6. Нельзя напрямую получить адрес ссылки.

Передача ссылки в функцию: f(x, y);

Наши рекомендации