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

Параметры функции

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

void fun(int,char,double); // прототип функции

imt k; // глобальная переменная

main()

{ int n=1;

char c=’a’;

fun(n,c,1.5); // n, c, 1.5 фактические параметры

}

void fun(int nn, char cc, double dd) // nn, cc, dd формальные параметры

{

. . .

}

В функцию параметры могут пе­редаваться следующими способами:

- используя глобальные переменные, что соответствует неявной передаче параметров;

- используя в качестве формального параметра ссылки;

- по значению, посредством копирования некоторого значения фактического параметра в формальный;

- используя в качестве параметров (фактического и формального) адреса.

В первом и втором случаях любое изменение формального параметра приводит к изменению фактического, а в третьем изменение формального параметра не влияют на значение фактического.

Аргументы функции, передаваемые в функцию по значению, являются локальными переменными. Это значит, что при передаче аргументов в функцию создаются их локальные копии, с которыми работает функция, то есть если в функции изменяется значение аргумента, то изменяется не переменная, которую передали функции в качестве аргумента, а её локальная копия:

#include <stdio.h>

void func(int x,int y);

main()

{ int x=1,y=2;

printf("\nmain() : x= %d y= %d",x,y);

func(x,y);

printf("\nmain() : x= %d y= %d",x,y);

return 0;

}

void func(int x,int y)

{ printf("\nfunc() : x= %d y= %d",x,y);

x=3;

y=4;

printf("\nfunc() : x= %d y= %d",x,y);

}

результат выполнения:

main(): x=1 y=2

func(): x=1 y=2

func(): x=3 y=4

main(): x=1 y=2

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

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

Область действия внешней переменной или функции распространяется от места ее декларирования до конца файла, в котором они расположены. Если же на внешнюю переменную требуется сослаться до того, как она определена, или если она определена в другом файле, то при ее декларировании используется слово extern.

Например, если декларации вида

int i;

float mas[5];

расположены вне всех функций, то они определяют внешние переменные i и mas, то есть декларирование и выделение памяти под эти объекты выполнено для остальной части файла. В то же время инструкции вида

extern int i;

extern float mas[];

декларируют, что объекты i (переменная) и mas (массив), имеющие тип int и float, не создаются, а память им выделяется при их объявлении в другой функции.

Для всего множества функций, образующих программу, должно быть не более одного определения каждой из внешних переменных. В объявлении массивов необходимо указывать их размерность, однако при декларировании массива с extern это не требуется.