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 Функции с переменным числом параметров
Функции с переменным числом параметров– это функции, в которых количество и типы параметров определяются только во время их вызова. Синтаксис определения прототипа таких функций: