第四章 函数
4.1 函数定义
函数是c程序中的基本单位。
4.1.1 函数定义的一般形式
函数定义的一般形式为:
返回类型 函数名(形参列表)
{
函数体
}
C语言不允许在函数中嵌套定义函数。
返回类型
实现函数需要确定有无函数返回值,返回值的类型,返回类型可以是C语言的除数组之外的任意数据类型,默认为int型。
函数可以不返回值,即返回类型为void,表示没有返回值。
函数头也称为函数接口,一组适合应用程序开发的函数接口统称为应用程序接口API
确定函数名
见其名知其意
形参列表
实现函数需要确定有无形式参数,以及有几个形式参数和参数的类型。每个参数都要有类型说明。
函数可以没有形式参数,此时要么不写要么写void,表示没有形式参数。
编写函数体
//编写判断m是否为素数的函数,并在主函数调用它
#include<stdio.h>
#include<math.h>
int IsPrime(int m);
int main()
{
int m;
printf("请输入m:\n");
scanf("%d",&m);
if(IsPrime(m))
printf("%d是素数\n",m);
else
printf("%d不是素数\n",m);
return 0;
}
int IsPrime(int m)
{
if(m<1)
return 0;
int i;
for(i=2;i<m;i++)
{
if(m%i==0)
return 0;
}
return 1;
}
4.1.2 函数返回
函数调用时,程序就会跳转到函数中,从函数体第一行往下执行,一直执行到}为止,这样称为自然结束,如果中间执行到了return语句,函数会立刻返回,函数执行结束。
return语句有两种,return;和return 表达式;
返回类型可以是void表示无返回值,或者是有返回值。
函数返回类型是由函数头中的返回类型定义的,如果return语句和返回类型不同,会进行隐式转换,如果不能转换,会报错。
main函数的返回值用于向操作系统返回程序的推出状态,返回0表示正常退出,否则异常退出。
4.2 函数参数
4.2.1 形式参数
函数定义中的形式参数列表简称形参,函数定义时指定的形参在未进行函数调用时并不实际占用内存单元,在被调用时才会分配实际内存单元,函数调用结束后,形参占用的内存单元会被自动释放。
4.2.2 实际参数
函数调用时提供给函数的参数称为实际参数。类型,次序和数目要和函数的形参一致。
4.2.3 参数传递机制
函数参数传递机制。
值传递(内部变量复制实参的值)和引用传递(内部变量复制实参的地址)
C语言中只有值传递,c++有引用传递。
4.2.4 函数调用栈
实参是通过进栈传递到函数内部的,
函数调用规定位c调用规定,实参从右往左依次进栈
4.2.5 const参数
函数定义时,允许在形参的类型前面加上const限定,用来限制一个对象的修改操作,即对象不允许被改变。
4.2.6 可变参数函数
4.3 函数原型与调用
4.3.1 函数声明和函数原型
函数先声明再调用
函数只可以定义一次,但可以声明很多次
函数调用只要在函数定义后面,就自然有了函数声明。
一般情况下,将函数声明放在头文件里,将函数实现放在源程序文件中,要调用的时候,用#include将头文件包括进来即可。
//编写求俩个数的最大公约数的函数。
#include<stdio.h>
#include<math.h>
int gcd(int m,int n); //函数原型,声明在前
int main()
{
int m,n;
scanf("%d%d",&m,&n);
printf("%d",gcd(m,n)); //调用在后
return 0;
}
int gcd(int m,int n) //实现定义在后
{
int t;
while(n!=0){
t=m%n;
m=n;
n=t;
}
return m;
}
4.3.2 库函数的调用方法
(1)添加库函数声明即头文件
(2)将库函数目标代码连接到函数中去
4.3.3 标准库函数
4.4 内联函数
在编译时,将被调函数的代码,直接嵌入到主调函数中,取消调用这个环节,这种嵌入进去的函数叫做内联函数。内联函数声明为在返回类型前加上inline修饰符。
内联函数通常很小,就几行。
4.5 函数调用形式
4.5.1 嵌套调用
C语言允许嵌套调用,即在调用一个函数的过程中,再调用另一个函数,只要调用前有相对应的函数声明即可。
4.5.2 递归调用
函数直接或者间接调用自己称为递归调用。C语言允许递归调用。
4.6 作用域和声明周期
4.6.1 局部变量
4.6.2 全局变量
4.6.3 作用域
4.6.4 程序映像和内存布局
4.6.5 生命期
4.7 对象初始化
4.8 声明与定义
4.9 变量修饰小结
4.10 程序组织结构
4.10.1 内部函数
4.10.2 外部函数
4.10.3 多文件结构
4.10.4 头文件与工程文件
4.10.5 提高编译速度
4.11 函数应用举例