“函数”,大家对此应该不陌生,在数学上时时要用到,但此函数非彼函数,不过也有异曲同工之妙。
1. 函数是什么
计算机的函数,是一个固定的一个程序段,或称其为一个子程序。
子程序是程序中的某部分代码,由一个或多个语句块组成。它负责完成某项特定的任务,并且具有相对的独立性。
大部分函数如同数学意义上的函数有输入,有输出,一般会有输入参数并有返回值,提供对过程的封装和细节的隐藏。
写一个函数尽量符合高内聚,低耦合的特点,这样容易的写出高效的代码,也能够实现分工,不会出现我改了那个地方的代码导致该处的函数也要修改,便于调试,修改代码。
2. C语言中的函数分类
- 库函数
- 自定义函数
2.1 库函数
库函数是如何来的呢,举个例子:当大家学习编程时,写出程序后想知道结果,需要将结果打印至屏幕,这个时候我们会频繁的使用一个功能:将信息按照一定的格式打印到屏幕上(printf)。
但是我们每写一个就需要写一遍打印函数,这样就显得很麻烦,于是就出现了库函数,将函数封装至库函数,想使用时(#include)包含头文件,然后直接调用即可。
库函数(Library function)是将函数封装入库,供用户使用的一种方式。
调用的时候把它所在的文件名用#include<>加到里面就可以了。
例如:需要的包含文件:stdio.h
getchar,putchar,printf,scanf,fopen,fclose,fgetc,fgets,fprintf,fsacnf,fputc,fputs,fseek,fread,fwrite等。
C语言常用的库函数有:IO函数,字符串操作函数,字符操作函数,内存操作函数,时间/日期函数,数学函数…
2.2 自定义函数
库函数只是封装了一些常用且普遍的函数而已,它不可能满足所有要求的,那还要程序员干啥,此时就需要大家自己写一个自定义函数了。
自定义函数和库函数一样,有函数名,返回值类型和函数参数。
ret_type fun_name(para1, * )
{
statement;//语句项
}
上述代码中:
ret_type 返回类型
fun_name 函数名
para1 函数参数
下面举个例子:比较两个数找出最大值
3. 函数参数(实参、形参)
- 实际参数(实参)
真实传给函数的参数,叫实参。
实参可以是:常量、变量、表达式、函数等。
无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。
- 形式参数(形参)
形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内存单元),所以叫形式参数。形式参数当函数调用完成之后就自动销毁了。因此形式参数只在函数中有效。
大家都知道用下面的几句代码是通过中间变量来交换n1,n2的
int n1 = 1, n2 = 2;
int temp = n1;
n1 = n2;
n2 = temp;
那么如果将它封装为函数呢?
void swap(int x, int y)
{
int temp = x;
x = y;
y = temp;
}
此时得到的答案是:
我们发现n1,n2并没有像之前一样交换,原因是:
当将实参传给形参的时候,形参是实参的一份临时拷贝,对形参的改变不影响实参!
如果想要用函数交换该如何修改呢?只需要将变量的地址传过去
void swap(int* x, int* y)
{
int temp = *x;
*x = *y;
*y = temp;
}
通过n1,n2传过来的地址找到n1,n2的值,此时改变之后就是真的改变了
两者区别在于空间的使用:swap1是拷贝,改变后不影响n1,n2,swap2是通过地址直接找到并改变
- swap1
- swap2
4. 函数调用
- 传值调用
函数的形参和实参分别占有不同内存块,对形参的修改不会影响实参。(如上述的swap1) - 传址调用
传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。
这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操
作函数外部的变量。(如上述的swap2) - 嵌套调用
一个函数中调用另一个函数。
- 链式访问
一个函数的返回值作为另一个函数的参数。
5. 函数的声明与定义
5.1 函数声明:
1.把函数的名字、函数类型以及形参类型、个数和顺序告诉编译器。但是具体存不存在,函数声明决定不了。
2.函数的声明一般出现在函数的使用之前。要满足先声明后使用。
3.函数的声明一般要放在头文件中的。
4.函数声明可以把函数头部复制过来,在后面加一个分号“ ; ”,或者参数省略,留下类型。
函数声明形式:
int Add(int x, int y);
5.2 函数定义:
函数的定义是指函数的具体功能的实现。包括指定函数名,函数值类型、形参类型、函数体等。
函数定义形式:
int Add(int x, int y)
{
int a = x + y;
return a;
}