1.函数是什么
维基百科中对函数的定义:子程序
- 在计算机科学中,子程序是一个大型程序中的某部分代码,有一个或多个语句块组成。它负责完成某项特定任务,而且相对于其他代码,具备相对的独立性。
- 一般有输入参数并有返回值,提供对过程的封装和细节的隐藏。这些代码通常被集成为软件库。
2. C语言中函数的分类
*库函数
什么是库函数?
库函数实则为一些描述的基础功能,它们不是业务性的代码。我们在开发的过程中每个程序员都可能用的到,为了支持可移植性和提高程序的效率,所以C语言的基础库中提供了一系列类似的库函数,方便程序员进行软件开发。
为什么要使用库函数?
C的库函数极大地方便了用户,同时也补充了C语言本身的不足。 事实上,在编写C语言程序时,应当尽可能多地使用库函数,这样既可以提高程序的运行效率,又可以提高编程的质量。
怎么使用库函数? 需要自己死记硬背么?答案当然是否定的,要学会合理的使用工具。这里给大家推荐两个查询小工具: 1.MSDN 2.www.cplusplus.com
具体的使用方法在这里就不给大家一一赘述了,有兴趣的小伙伴可以自行了解学习哦。
最后简单总结一下,C语言常用的库函数:
-
IO函数 如:input/output printf scanf getchar putchar… -
字符串操作函数 如:strlen strcmp strcpy strcat… -
字符操作函数 如:tolower woupper… -
内存操作函数 如 memcpy memset memmove memcmp… -
时间/日期函数 如:time… -
数学函数 如:sqrt abs fabs pow… -
其他库函数 需要注意的是,我们在使用库函数的同时一定要引用对应的头文件
*自定义函数
自定义函数与库函数大体上一样,唯一的区别在于自定义函数的函数名,参数以及返回值和功能都是由我们自己来进行设计。 在这里简单介绍下函数的组成
ret_type fun_name(para1, * ) { statement;//语句项 } ret_type 返回类型 fun_name 函数名 para1 函数参数
下面举个简单的示例:
int get_max(int a, int b) { return(a > b ? a : b); }
可以看到这是一个简单的两个数之间找最大值的函数,可以看出我们定义返回值为int类型,函数名称为get_max。
3.函数的参数
*实际参数
真实传给函数的参数,叫实参。实参可以是:常量、变量、表达式、函数等。无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。
通俗来讲,调用函数时传递的参数则为实参。
*形式参数
形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内存单元),所以叫形式参数。形式参数当函数调用完成之后就自动销毁了。因此形式参数只在函数中有效。
上述距离函数中的a,b则为形参。
4.函数的调用
*传值调用
函数的形参和实参分别占用不同的内存块,对形参的修改不会影响实参的值。
int get_max(int a, int b) { return(a > b ? a : b); /if (a > b) return a; else return b;/ } int main() { int a = 0; int b = -1; scanf("%d%d", &a, &b); int max=get_max(a, b); printf("%d\n", max); return 0; }
在这段代码中我们可以看到调用get_max函数时将ab两个参数的值传递给了函数,在函数中进行了判断,并没有改变值。
*传址调用
传址调用是将函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。
这种传参方式可以让函数和函数外边的变量建立起来真正的联系,也就是函数内部可以直接操作函数外部的变量。
说到这里,我们就需要知道什么时候选择传值调用什么时候选择传址调用,实际上,当函数内部将要改变函数外部的值时则选择传址调用。下面举例说明:
void swap(int x, int y)//传值调用 { int z = 0; z = x; x = y = y = z; } void swap1(int* x, int* y)//传址调用 { int z = 0; z = *x; *x = *y; *y = z; } int main() { int a = 10; int b = 20; swap(a, b); printf("%d %d\n", a, b); swap1(&a, &b); printf("%d %d\n", a, b); return 0; }
这里我们swap函数采用传值调用,swap1采用传址调用,可以看到,当时用传值调用的swap函数时,ab值并没有发生变化,从这里我们就知道传值调用并没有改变外部函数的值,反观采用传址调用的swap1函数就起到了改变为外部函数的值的作用。
5.函数的嵌套调用和链式访问
函数和函数之间是可以有机的组合
*嵌套调用
嵌套调用实际上就表示为函数内容间可以调用其他函数,下面举个简单的示例:
int is_prime(int n)//素数的判断 { int j = 0; for (j = 2; j <= sqrt(n); j++) { if (n % j == 0) return 0; } return 1; } int get_max(int a, int b)//自定义函数,形式参数 { return(a > b ? a : b); /if (a > b) return a; else return b;/ } void swap1(int* x, int* y)//传址调用 { int z = 0; z = *x; *x = *y; *y = z; z=get_max(*x, *y); if (is_prime(z) == 1) printf("%d为素数。\n",z); else printf("%d不是素数。\n",z); } int main() { int a = 10; int b = 20; swap1(&a, &b); printf("%d %d\n", a, b); return 0; }
这里可以看到在swap1中,我们调用了get_max找到了ab中的最大值,再调用了is_prmie函数判断该最大值是否为素数。
需要注意的时函数虽然可以嵌套调用,但绝对不可以嵌套定义。
*链式访问
链式访问指的时把一个函数的返回值作为另一个函数的参数,一个简单的示例为:
printf("%d", printf("%d", printf("%d", 43)));
在这个代码段中,printf("%d",43)的返回值作为了他外部的printf的参数,由于printf的返回值表示的是打印字符的个数,所以printf("%d",printf("%d",43))等价于printf("%d",2),所以最后输出结果为4321.
今天的内容就先介绍到这里啦,我们下期再见。
|