Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекции по С++.doc
Скачиваний:
120
Добавлен:
19.05.2015
Размер:
2.43 Mб
Скачать

2.4. Описание функции

Пример описания функции:

int func(int a, char *str, float b[])

{

…//операторы тела функции

}

Строка int func(int a, char *str, float b[]) – это заголовок функции; функция возвращает целочисленный результат, func – это имя функции, a, str, float b[] – формальные параметры функции (a – целочисленная переменная, str – указатель на тип char, т.е. строка, b – имя одномерного массива значений типа float).

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

2.5. Организация вызова функции

Форма вызова функции:

<имя_функции>(<список_фактических_параметров>);

Если при описании функции список формальных параметров отсутствовал, то при вызове функции <список_фактических_параметров> так же должен отсутствовать. При вызове функции ей передается управление. Опишем организацию вызова функции.

Каждая строка в программе определяется своим адресом. Строка вызывающей функции, в которой вызывается другая функция, также имеет свой адрес, называемый точкой вызова функции. При вызове функции,в ОП организуется структура, которая называется стеком.

При вызове функции стек заполняется следующим образом:

  1. В стек помещается адрес вызова функции.

  2. В стек копируются значения переданных в функцию фактических

параметров.

  1. Выполняются операторы тела функции.

  2. После того как функция завершила свою работу из стека в ячейки ОП, выделенные под переменные, являющиеся фактическими параметрами, копируются (возвращаются) скопированные туда их же значения при вызове функции.

  3. Из стека забирается адрес точки вызова функции, и по этому адресу происходит возврат в вызывающую функцию.

Затем выполняются операторы вызывающей функции, следующие за строкой вызова функции.

2.5. Передача параметров в функцию

В языке С++ может быть передача параметров по значению или по адресу. Формальным параметром-значением может быть только имя переменной определенного типа, например стандартного или структуры, определенной пользователем. Массивы, функции и файлы в языке С++ передаются только при помощи указателей.

Фактическим параметром, соответствующим формальному параметру-значению, для стандартных типов может быть выражение, результат которого при вызове функции копируется в стек, т.е. при передаче в функцию значения параметра любого типа в виде выражения, определяющего значение переменной – формального параметра, оно копируется в стек. Из­менение этого значения в теле функции не ведет к изменению оригинального значения соответствующего ему фактического параметра в вызывающей функции.

При использовании формального параметра-указателя в качестве фактического параметра передается указатель, т.е. адрес переменной. Только указатели обеспечивают доступ не к копиям значений, а к самим значениям переменных (фактических параметров) вызывающей функции. В зависимости от адресуемой переменной указатель может быть адресом данных любого типа, в том числе массива, структуры, массива структур, файла, функции и указателя. В стек копируется адрес фактического параметра, а не его оригинальное значение. Таким образом, передавая через указатель адрес фактического параметра, в теле вызываемой функции можно будет изменить значение по передаваемому адресу, следовательно, по завершении работы функции оригинальное значение фактического параметра будет изменено. При этом не будет изменено значение адреса фактического параметра.

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