Void func(int intg,float fltp)

{printf("intg=%d &intg=%p ",intg, &intg);

printf("fltp=%f &fltp=%p\n",fltp, &fltp);

intg+=10; fltp*=2;

printf("intg_n=%d fltp_n=%f\n",intg,fltp);}

Void main()

{int i=200; float f=100.25;

Func(i,f);

printf("i=%d &i=%p f=%f &f=%p\n",i,&i,f,&f);}

В результате работы программы на экран выведется:

intg=200 &intg=8FD8:0FF2 fltp=100.25 &fltp=8FD8:0FF4

intg_n=210 fltp_n=200.5

i=200 &i=8FD8:0FFC f=100.25 &f=8FD8:0FF8

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

Пример. В функцию передаются указатели на переменные и значения этих переменных меняются местами:

#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 &j=%p j=%d\n",&i,i,&j,j);

swap(&i,&j); //Вызов функции

printf("i=%d j=%d\n",i,j);}

В результате работы программы на экран выведется:

&i=8FD8:0FFE i=5 &j=8FD8:0FFC j=60

&a=8FD8:0FF4 a=8FD8:0FFE *a=5

&b=8FD8:0FF8 b=8FD8:0FFC *b=60

*a_n=60 *b_n=5

i=60 j=5

1.3 Функции и массивы

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

int func1(int arr[]) {...}

илиint func2(int *mass) {...}

В обоих случаях в функции создается копия указателя соответст­вующего типа, который действует внутри функции как обычный ука­затель-переменная и может изменять свое значение. Например, arr++. Доступ к элементам массива внутри функции может осуществляться как с помощью индексов (arr[1], arr[i]), так и применяя опера­цию разыменования указателя ( *(arr+1), *(arr+i)).

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

Есть два способа определения конца массива: 1) в качестве одного из параметров в функцию передается размер массива; 2) последний элемент массива задается каким-либо уникальным значением, которое анализируют в функции.

Пример. Функция вычисляет сумму элементов массива, в качестве одного из параметров в функцию передается размер массива.

#include <stdio.h>

int sum(int N,int x[]) //Определение функции

{int S=0;

for(int i=0;i<N;i++) S+=x[i];

return S;}

Void main()

{int a[5]={1,3,5,10,2},c[3]={2,1,6},res1,res2;

res1=sum(5,a); //Вызов функции

printf("сумма элементов массива a=%d\n",res1); // 21

res2=sum(3,c); //Вызов функции

printf("сумма элементов массива c=%d\n",res2);} // 9

Пример. Функция вычисляет количество символов в слове, в качестве признака конца массива используется '\0'.

#include <stdio.h>

int len(char *); //Прототип функции

Void main()

{char *name="TERMINATOR";

printf("Длина 1-ой строки=%d",len(name)); // 10

char *str="Высшая математика";

printf("Длина 2-ой строки=%d",len(str)); } // 17

int len(char *c) //Определение функции

{int i=0;

while(c[i++]);

return i-1; } //длина строки без учета символа '\0'

Пример. Функция изменяет значения элементов массива, поменяв их на квадраты этих значений, тип функции void

#include <stdio.h>

void exch(int, int []); //Прототип функции

Void main()

{int a[5]={1,3,5,8,2};

printf("Массив до изменения: ");

for(int i=0;i<5;i++) printf(" %d",a[i]);

exch(5,a); //Вызов функции

printf("\nМассив после изменения: ");

for(int i=0;i<5;i++) printf(" %d",a[i]);

}

void exch(int N,int x[]) //Определение функции

{for(int i=0;i<N;i++) x[i]*=x[i];}

В результате на экран выведется:

Массив до изменения: 1 3 5 8 2.

Массив после изменения: 1 9 25 64 4.

1.4 Функции с умалчиваемыми значениями параметров

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

тип имя_параметра=умалчиваемое_значение

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

Пример. Функция находит произведение 2-х переменных

#include <stdio.h>

int def(int a=10, int b=3){return a*b;}

Void main()

{int am=2, bm=5, res1,res2,res3;

res1=def(); // 10*3=30

res2=def(am); // 2*3=6

res3=def(am,bm); // 2*5=10

printf("res1=%d res2=%d res3=%d\n",res1,res2,res3); }

В результате работы программы на экран выведется:

res1=30 res2=6 res3=10

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

Пример. Функция находит сумму 3-х переменных

#include <stdio.h>

int sum(int,int=5,int=10); //Прототип функции

Void main()

{int am=20, bm=50, cm=100, s1,s2,s3,s4;

s1=sum(am); // 20+5+10=35

s2=sum(am,bm); // 20+50+10=80

s3=sum(am,bm,cm); // 20+50+100=170

printf("s1=%d s2=%d s3=%d\n",s1,s2,s3);}

int sum(int a,int b,int c) //Определение функции

{return a+b+c;}

В результате работы программы на экран выведется:

s1=35 s2=80 s3=170

1.5 Функции с переменным числом параметров

Функции с переменным числом параметров– это функции, в ко­торых количество и типы параметров определяются только во время их вызова. Синтаксис определения прототипа таких функций:

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