第三章 函数
第1节
之前有简单介绍过函数,函数时C语言中不可缺少的一环,可以极大的将代码重复利用,提高我们的工作效率,也会使代码的可读性更高,使代码更加好看。因此这个章节我们将详细讲讲C语言中的函数。
函数的分类
库函数
C语言基础库中有一些大佬们提前写好的函数放在文件中,一共我们进行更方便更快捷的使用,要使用对应的库函数只需要在文件开头引入对应的头文件即可,这可对我们程序编写带来了不少方便。例如#include <stdio.h>
;#include <string.h>
。
有些同学或许会有疑问,那么库函数这么方便那么我们需不需要把库函数背下来呢?答案当然是不需要的。 因为常用的库函数我们用多了自然就熟记于心,然而不常用的库函数等我们需要用他们的时候再去查看官方文档即可,注意我这里是的是官方的文档,作为一个程序员要养成多看文档,及时看文档的习惯,相比把库函数背下来冒着有可能出错的风险我们不如到用的时候花一些时间去查看官方文档。在此我推荐一个网址:
http://www.cplusplus.com/
这个是C语言国际委员会官方编写的文档,也是最为准确的文档。也许有的同学更喜欢上MSDN查看文档,但是我要说的是,MSDN是微软发布的,和官方的比谁更有权威相信大家都能轻易评判出来的吧!
对于C语言的基础库函数来说,我只能用一个字来形容:弱。 弱爆了的弱,而且C语言要是想要添加第三方库函数还及其麻烦,十分不辩解,相比下JAVA简直是一股清流啊。因此既然库函数无法满足我们的日常需求,就得要我们自己动手了,接下来我接着介绍自定义函数。
自定义函数
自定义函数,正如其名,就是我们自己定义的函数,那么自定义函数需要遵循什么格式呢?1
2
3
4ret_type fun_name(para 1,* )
{
statement;//语句项
}
没错以上这个就是自定义函数的模版了,返回值+函数名+(括号内参数)+大括号包含语句项的方式即可定义出一个供我们自己使用的函数。下面是一个判断数字大小的简单的例子。1
2
3
4int get_max(int x, int y)
{
return (x > y) ? x : y;
}
在这个函数中我用了一个三目运算符,用来判断x, y中更大的值并且返回。于是这么一个比较大小的函数就被我定义出来了。
函数的参数
在函数被调用的时候,函数中的参数会发生一些微妙的改变。在调用的时候传给函数的值,这样的参数我们称之为实参,而在函数定义时,后面括号的值我们则称之为形参,这里十分容易搞混,简单来说就是函数定义时的参数是形参,调用时的参数是实参。为什么我们要区分实参和形参呢?
在函数调用过程中,我们将函数值传递进函数体中的时候,实际在函数体内形成了一份新的内存空间用来存储我们传递进去的值,因此形参在函数体内无论再怎么改变都不会影响调用函数时使用的实参。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>//添加头文件
#include <stdlib.h>
void exchange(int num1, int num2)
{
int t = num1;
num1 = num2;
num2 = t;
}
int main()//主函数,函数入口
{
int num1 = 1;
int num2 = 2;
exchange(num1, num2);
printf("num1 = %d,num2 = %d\n", num1, num2);
system("pause");
}
运行以上的代码就会发现在函数内部我们明明已经交换num1和num2的值但是为什么在主函数中却没有任何改变呢?这就是我们所说的实参与形参以及函数副本传递参数的特性,大家只需要记住一句话即可:传给函数的形参不过是实参的一个副本。
但是如果我们要是想在函数中对实参进行改变我们该怎么做呢?没错这里我们就要用到C语言的灵魂工具——指针。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>//添加头文件
#include <stdlib.h>
void exchange(int* num1, int* num2)
{
int t = *num1;
*num1 = *num2;
*num2 = t;
}
int main()//主函数,函数入口
{
int num1 = 1;
int num2 = 2;
exchange(&num1, &num2);
printf("num1 = %d,num2 = %d\n", num1, num2);
system("pause");
}
我们将代码稍作修改,将函数类型转为指针型,大家就会发现,num1和num2的值已经交换了,这其中能够交换都得多亏我们使用指针找到了实参的地址,才能在函数内对其进行修改。
关于函数的调用在下一节会有详细讲解。