函数
函数分类
库函数
也叫标准函数,由系统提供,用户不必定义。只需在程序前包含该函数所在头文件,就可以直接调用
用户自定义函数
根据需要,按照C语言法则自己编写的一段程序,实现特定的功能
从函数参数传递的角度
有参函数
在函数定义时,带有参数的函数,在函数定义时的参数称为形式参数,在相应的函数调用时也必须有参数成为实际参数,在函数调用时,主调函数和被调函数之间通过参数进行数据传递,主调函数可以把实际参数的值传递被调函数的形式参数
无参函数
在函数定义时,没有形式参数的函数在调用无参函数时,主调函数并不将数据传送给被调函数
函数的定义
类型名 函数名(形参类型说明表)
{
说明语句
执行语句
}
- 函数名必须是一个合法的标识符,并且不能与其他函数和变量重名
- 类型名指定函数返回值的类型,如果定义函数时不指定函数类型,系统会隐含指定函数的类型为int型,无返回值的函数的类型,应指定为void空类型
- 形参类型说明表又称形参列表
- 说明语句和执行语句合在一起,称为函数题,函数题可以暂时没有具体内容,此时表示占一个位置。一定的功能,以后再加以补写
举个例子
#include<stdio.h>
max(int x,int y)
{
if(x>y)
return x;
else
return y;
}
main()
{
int a,b,m;
printf("请输入两个正整数\n");
scanf("%d,%d",&a,&b);
m=max(a,b);
printf("大的数为%d",m);
}
函数的参数和返回值
函数间的数据传输包括两个方面
- 数据从主调函数传递给被调函数
- 数据从被调函数回到主调函数
形式参数和实际参数
在函数第一的首部函数名后,括号中说明的变量称为形式参数,简称为形参,形参的个数可以有多个多个形参之间用逗号隔开,与形参相对应当一个函数被调用时的时候。在被调用处给出对应的函数,这些参数称为实际参数,简称实参,每个实参都可以是常量变量和表达式
- 形参定义时编译系统并不为其分配储存空间,也无初值。只有在函数调用时临时分配储存储空间,接受来自实参的值函数调用,结束内存空间释放,值消失
- 实参可以是常量变量和表达式,但必须在函数调用之前有确定的值
- 是参与形参之间是单向的值传递,在函数调用时将个实参表达式的值计算出来,赋给形参变量,因此实参与形参必须类型相同或赋值,兼容个数相等,一一对应,在函数调用过程中,即使实参为变量,形参值得改变,也不会改变实参变量的值
函数与数组
数组元素只能作为函数的实参,不能作为函数的形参
函数的返回值
返回语句形式
return 表达式;
功能:将表达式的值带回给主调函数。
返回语句的说明
- 函数内可以有多条返回语句,但每条返回语句的返回值只有一个。
- 当函数不需要指明返回值,可以写成:
return; - 当函数无返回值时,表示最后一条语句执行完自动返回。
- 函数可以出现多个return语句,但真正执行到一个,无论执行到哪一个,都要返回到主调函数,并带有返回值。
max(int x,int y)
{
if(x>y)
return x;
else
return y;
}
函数的调用
函数调用的一般形式
函数名 (实参列表);
例如
max(a,b)
- 实参表列示用逗号分隔开的变量,常量表达式,函数等,不管实参是什么类型,在进行函数调用时,实参必须有确定的值,以便把这些值传给形参
- 函数的实参和形参应在个数,类型和顺序上一一对应,否则会发生类型不匹配的错误
- 对于无参函数调用时,实参列表为空,但括号不能省略
函数调用的方式
函数的调用,一表达式的形式出现在程序中,称为函数表达式调用,这时要求函数必须带回一个确定的返回值
#include<stdio.h>
shuixian(int x,int y,int z)
{
int t;
t=x*x*x+y*y*y+z*z*z;
return t;
}
main()
{
int i,j,t,n,shu;
for(i=100;i<=999;i++)
{
j=i/100;
t=i%100/10;
n=i%10;
shu=shuixian(j,t,n);
if(i==shu)
printf("%4d",shu);
}
}
函数声明和函数类型
对用户定义的被调函数的声明,当被调函数在主调函数之后定义,其数据类型,不是int型和char型,则一定要在主调函数之前和主调函数的说明部分对被调函数进行说明
main()
{
float add(float x,float y);
float a,b,c;
scanf("%f%f",&a,&b);
c=add(a,b);
printf("sum is %f",c);
}
float add(float x,float y)
{
return(x+y)
}
函数的嵌套调用
这里不做赘述,举例说明
#include<stdio.h>
#include<math.h>
#define PI 3.14159265
double mianji(double a);
double yuanhuan(double x,double y);
main()
{
double a,b,are;
printf("请输入两个同心圆半径\n");
scanf("%lf,%lf",&a,&b);
printf("%lf",yuanhuan(a,b));
}
double mianji(double a)
{
double s;
s=PI*a*a;
}
double yuanhuan(double x,double y)
{
double are;
are=fabs(mianji(x)-mianji(y));
return(are);
}
函数的递归调用
同上
#include<stdio.h>
long int qiuhe(unsigned int n)
{
int s;
if(n==1)
return 1;
else
s=qiuhe(n-1)+n;
return s;
}
main()
{
unsigned int n;
printf("请输入一个数的求和\n");
scanf("%u",&n);
printf("Σ%u=%u",n,qiuhe(n));
}
变量的作用域
局部变量
在一个函数内部定义的变量和复合语句内定义的变量称为局部变量局部变量的作用域仅限于定义它的函数或复合语句中任意一个函数都不能访问其它函数中定义的局部变量因此在不同的函数之间可以定义同名的局部变量虽然同名但却代表不同的变量不会发生命名冲突
全局变量
在所有函数包括主函数外,定义的变量即为全局变量,全局变量存放在静态储存区中。其作用域是从定义的位置开始到本源文件结束,对于全局变量,如果在第一时间不进行初始化,则系统将自动赋予其初值
内部函数和外部函数
内部函数
所定义的函数只能被本源文件中的函数调用,这种函数称为内部函数,内部函数不能被同一程序其他源文件中的函数调用
形式:
static 类型说明符 函数名(形参表)
static int f(int a,int b)
外部函数
外部函数在整个源文件中都有效,用关键字extern来表示,由于函数的本质是全局的,因此函数定义时可以不加关键字,C语言隐含其外部函数
类似于非静态全局变量,同一个外部函数在所有源文件中只定义一次,如果在其他源文件中要调用该外部函数,则需要用extern关键字加函数原型对他进行外部引用声明
/*文件一*/
int x=10; /*定义非静态全局变量*/
int y=10;
add( )
{
y=10+x;
x=x*2;
}
main()
{
extern sub(); /*对外部函数进行引用申明*/
x+=5;
add();
sub();
printf("x=%d,y=%d\n",x,y);
}
/*文件二*/
sub( )
{
extern int x;
x=x-5;
}
结果
x=25,y=25.