------ 知之博客期待与您交流! -------
一 函数的概述
函数:功能相对独立的一个代码段。类似于java或oc里面的方法。
c语言程序是有函数组成的,也可以说是由若干个功能相对独立的代码段组成的。c语言不仅提供了库函数还允许用户建立自己定义的函数。用户可把自己的算法编成一个个相对独立的函数模块,然后调用方法使用函数。可以说c程序的全部工作都是由各样的函数完成的,所以c语言称为函数式语言。
c语言是一门面向过程的语言,跟面向对象有本质上的区别。面向过程的语言最大的体现就是由若干个函数组成的,面相对象的语言可以总结为万物皆对象,是由对象组成的。
二 函数的分类
1).函数定义的角度出发,可以分为库函数和用户定义函数两种。
库函数:由c系统提供,用户无需定义,也不必再程序中做类型说明,只需在程序前包含该函数原型的头文件即可在程序中直接调用。比如我们熟悉的:printf、scanf、getchar、gets等等。
用户定义函数:用户按照需要写的函数。对于用户自定义函数,不仅要在程序中定义函数本身,而且在主调函数模块中还必须对该调用函数进行类型声明才能使用。
2).语言的函数兼有其他语言中的函数和过程两种功能,从这个角度看,又可以把函数分为又返回值函数和无返回值函数两种。
有返回值的函数:此类函数调用执行完后将向调用者返回一个执行结果,称为函数返回值。如数学函数即属于此类函数,由用户定义的这种要返回函数值的函数,必须在函数定义和函数说明中明确返回值的类型。
无返回值函数:此类函数用语完成某项特定的处理任务,执行完成后不向调用者返回函数值。这类函数类似于其他语言的过程。由于函数无需返回值,用户在定义函数时可以制定他的返回为“空类型”,空类型的说明符为:“void”。
3).从主调函数和被调函数之间数据传送的角度可以分为无参函数和有参函数。
无参函数:函数定义、函数说明及函数调用中均不带参数。
有参函数:也成为带参函数,在函数定义及函数声明时都有参数,也称为形式参数。在函数调用时也必须给出参数称为实际参数。
4).c语言提供了极为丰富的库函数,又可以分为以下几类:字符类分类函数、目录路径函数、诊断函数、图形函数、输入输出函数、接口函数、字符串函数等等。
三 函数的形式
1).函数声明
尽管系统提供了大量的库函数,但是这些函数并不能完全覆盖所有的应用场合,在实际场合,程序员往往需要自己进行定义一些函数。了解如何实现自定义函数:
函数的声明也叫做函数原型,需要规定函数的名称、参数类型、返回值类型,形式为:
类型说明符 被调函数名 (类型 形参,类型 形参,...);
或:
类型说明符 被调函数名 (类型 ,类型 ,...);
例如: int max (int a , int b); //返回值类型是int型,参数的类型也是int
void sum (int a , int y); //返回值类型是void型,也就是无返回值,参数的类型是int
void compute( ); //无形参,也没有返回值
2).函数的基本格式
例如:int main () { //int 就是返回值类型 ,mian是函数名称,无函数参数
函数体; //函数题一般包括声明部分和执行部分
}
四 区别参数的传递方式
形参和实参的功能都是进行数据传送,发生在函数调用时,主调函数把实参的值传送给被调函数的形参传递方式(传值)、地址传递方式(传址)。
传值(传址):都是将实参单向传递给形参的一种方式。区别在于传递的数据类型不同--传址传送的事地址,传值传送的是一般的数值。
注:传值 注:传址
五 函数的递归调用
例如:斐波那契数列
斐波纳契数列,又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、21、……
这个数列从第三项开始,每一项都等于前两项之和。
有趣的兔子问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?兔子的规律为数列1,1,2,3,5,8,13,21....
代码如下:
int main()
{
long f1,f2;
int i;
f1=f2=1;
for(i=1;i<=20;i++) {
printf("%12ld %12ld",f1,f2);
if(i%2==0)
printf("\n");/* 控制输出,每行四个*/
f1=f1+f2; /* 前两个月加起来赋值给第三个月*/
f2=f1+f2; /*前两个月加起来赋值给第三个月*/
}
}
六 内部函数和外部函数
类似于全局变量的作用域,函数定义时也可以用static修饰。static用来修饰外部函数;extern用来修饰内部函数,也可以省略。
1).内部函数,只能被本源文件(模块)中的各个函数所调用,不能被其他模块中函数调用的函数,又被称为静态函数。
定义如下:
static 函数类型 函数名 (形参表)
{
......
}
使用场合:某些涉及机器硬件、操作系统的底层函数,如果使用不当或者错误使用就会造成问题,程序员认为自己的某些函数仅仅是自己模块中其他函数的底层函数,不必要被其他程序员调用等场合都适合用static来修饰。
2).外部函数:能被任何源文件(模块)中的任何函数所调用的函数
定义如下:
extern 函数类型 函数名 (参数表)
{
......
}
使用场合:需要在某个模块中调用它,就可以在某个位置生命extern函数就可以了。
注:extern关键字可以省略,默认为外部函数。