一、函数分类:从函数定义角度分为:库函数,用户定义函数。从返回值来分:有返回值得函数,无返回值函数。从参数类型分:无参函数,有参函数。
下面是调用函数例子:
#include<stdio.h>
int main()
{
void print_star(); //声明print_star函数
void print_message(); //声明print_message函数
print_star(); //声明print_star函数
print_message(); //print_message函数
print_star(); //调用print_star函数
return 0;
}
void print_star() //定义print_star函数
{
printf("*****************\n");
}
void print_message() //定义print_message函数
{
printf("how do you da!\n");
}
二、定义函数的方法
1、类型名 函数名()
{
函数体
}
2、定义有参函数
int max(int x,int y)
{
int z;
z=x>y ?x:y;
return z;
}
3、定义空函数
void dummy()
{}
注意:
函数类型名为:int ,float ,char,等时,函数需要有返回值给主调函数;当函数名为void类型时,函数无返回值给主调函数.
三、调用函数。
1.函数调用一般形式为:
函数调用语句
函数表达式
函数参数
四、函数调用时的数据传递
1、形式参数和实际参数:
在调用有参函数时,主调函数和被调函数有数据关系
2、
实参和形参间的数据传递
在调用函数过程中,系统会把实参的值传递给被调函数的形参、
例:
int max(int x,int y) //定义max函数
{
int z; //定义临时变量
z=x>y? x:y; //将最大值赋给z
return z; //把z作为max函数的值返回到main函数中
}
#include<stdio.h>
int main()
{
int max(int x,int y); //对max函数的声明
int a,b,c;
printf("please enter two number:");
scanf("%d%d",&a,&b);
c=max(a,b); //调用max函数,将a,b的值分别赋给x,y
printf("max is %d\n",c);
return 0;
}
五、函数的嵌套调用
函数可以嵌套调用,但不能嵌套定义。
例:输入四个数判断大小。
#include<stdio.h>
int main()
{
int max4(int a,int b,int c,int d); //定义max4函数
int a,b,c,d,max;
scanf("%d%d%d%d",&a,&b,&c,&d);
max=max4(a,b,c,d); //对max4函数进行调用
printf("%d\n",max);
return 0;
}
int max4(int a,int b,int c,int d)
{
int max2(int a,int b); //定义max2函数
int m;
m=max2(a,b); //对max2函数进行调用,将a,b的最大值赋给m;
m=max2(m,c); //对max2函数进行调用,将m,c的最大值赋给m;
m=max2(m,d); //对max2函数进行调用,将m,d的最大值赋给m;
return m; //将四个数中最大值返回但mian函数中
}
int max2(int a,int b)
{
int z;
z=a>b? a:b;
return z;
}
上面这个代码即是嵌套调用,在main函数中调用max4,在max4函数中调用max2,将max2的值返回到max4,将max4的值返回到main函数中。
六、函数的递归调用
在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为递归调用。
例:求n!的值
#include<stdio.h>
int main()
{
int fac(int n);
int n;
int y;
printf("input an integer number\n");
scanf("%d",&n);
y=fac(n);
printf("%d\n",y);
return 0;
}
int fac(int n)
{
int f;
if(n<0)
printf("n<0,data errors");
else if(n==0||n==1) //n=0或n!=1
f=1;
else
f=n*fac(n-i); //n>1时,n!=n*(n-1)
return f;
}
从函数体中分析f=fac(1)*2,再调用fac(1),返回值为1.这个值就取代了f=fac(1)2中的fac(1),从而f=12=2.递归终止条件n=0或n=1。
七、数组作为函数参数
1、数组元素作函数实参。
在用数组元素作函数实参时,把实参的值传给形参,是值传递方式,数据传递的方向是从实参传到形参,单向传递。
int main()
{
float average(float array[10]);
float a[10];
for(i=0;i<9;i++)
scanf("%d",a[i]);
int aver;
aver=average(a); //向被调函数传入数组
}
float average(float array[10]) //定义average函数
{
}
用数组元素作实参时,向形参变量传递的是数组元素的值,而用数组名作函数实参时,向形参传递的是数组首元素的地址