目录
1.函数的概念
2.库函数
3.自定义函数
4.形参和实参
5.return语句
6.数组作函数参数
7.嵌套调用和链式访问
8.函数的声明和定义
1.函数的概念
函数可以被理解为一个个小的零件,可以完成程序中特定的任务。一个项目可以拆分成多个函数,就像一个机器有多个零件,举个例子:
题目:输入两个整数,求这两个数的和,积,差。
如果不用函数,我们可以这么写:
#include <stdio.h>
int main()
{
int x, y;
scanf("%d%d", &x, &y);
int he = x + y;//计算和
printf("%d\n", he);
int ji = x * y;//计算积
printf("%d\n", ji);
int cha = x - y;//计算差
printf("%d\n", cha);
return 0;
}
不难发现,这个代码要完成三个功能:
1.求和并打印
2.求积并打印
3.求差并打印
我们可以用三个函数分别实现这三个功能,所以诞生了以下的写法:(后面会详解自定义函数,现在不需要看懂)
#include <stdio.h>
void he(int x, int y)//求和函数
{
printf("%d\n", x + y);
}
void ji(int x, int y)//求积函数
{
printf("%d\n", x * y);
}
void cha(int x, int y)//求差函数
{
printf("%d\n", x - y);
}
int main()
{
int x, y;
scanf("%d%d", &x, &y);
he(x, y);//求和函数
ji(x, y);//求积函数
cha(x, y);//求差函数
return 0;
}
这个函数更长,看起来更复杂,但是实际上完成了函数的分装,简化了该项目。
我们从主函数开始看,不难发现,该程序将一个大的工程分装成了多个小工程,更具有条理性和可读性(更容易读懂),也有助于程序员的思考。由于该代码比较简单,很难看出函数的优点,但是,你可以发挥想象力,如果是一个几百行代码的大工程,这里用函数分工行动,是不是会简化代码,帮助程序员梳理思绪?
其次,如果一个功能在程序中多次使用,这个函数也是可以复用的(在程序中的其他地方,如果想要再次使用该函数的功能,可以直接用该函数,不用再写一遍),提升了开发软件的效率。
可见,函数的好处很多,很值得我们去学习。
2.库函数
2.1:定义:c语言标准中提供了语法规则,但不提供库函数,他是由编译器厂家生产出来的,库函数也是函数,也是完成一个个各不相同的功能的。同时,具有类似功能的函数会被包含在同一个头文件中(printf和scanf函数都被包含在<stdio.h>中,如果想使用这两个函数,就要在第一行写上熟悉的#include<stdio.h>)。举例:前面学习的scanf,printf以及你见过的函数都是库函数。
2.2;怎么学习库函数
1.cplusplus网站,他具有最权威的解释。
2.观看csdn上其他人的文章,嘿嘿。
在学习的时候要注意几个要点:
1.记住函数的名字,该函数被什么头文件所包含
2.学习函数的参数及参数类型
3.学习返回值以及返回值的类型
4.函数有什么功能
5.代码举例
初学者自学库函数还是有些困难,但授人以鱼不如授人以渔,现在由我带领大家学习一个库函数
sqrt
double sqrt(double x)
1.该函数的名字是sqrt,该函数被<math.h>所包含
2.使用该函数要上传一个double类型的参数
3.该函数会返回一个double类型的值
4.该函数是用来求一个数的平方根的
5:
#include <stdio.h>
#include <math.h>//sqrt函数被math.h包含
int main()
{
double d = 16.0;//d是一个double类型的值
double r = sqrt(d);//我们将d写在括号里,简化它上传上去
//然后sqrt计算被上传的值(d)的平方根,由于返回值类型是
//double,所以d的平方根会以double的类型返回,所以此处会返回
//4.000000(12个0,double型的数据保留小数点后6位)
//所以sqrt(d)等价于4.000000,然后,我们用double型的r
//接收这个值,那么,r就是4.000000了。
printf("%lf", r);
return 0;
}
我们将d写在括号里,将它上传上去
//然后sqrt计算被上传的值(d)的平方根,由于返回值类型是
//double,所以d的平方根会以double的类型返回,所以此处会返回
//4.000000(6个0,double型的数据保留小数点后6位)
//所以sqrt(d)等价于4.000000,然后,我们用double型的r
//接收这个值,那么,r就是4.000000了。
3.自定义函数
要点:
1.函数的参数及参数类型
2.返回值以及返回值的类型
3.函数有什么功能
ret_type fun_name(形参)
{
}
这是一个函数的基本写法
ret_type是返回值类型
fun_name是函数的名字
花括号里是函数体
现在,可以讲讲前面的函数了
#include <stdio.h>
void he(int x, int y)//求和函数
{
printf("%d\n", x + y);
}
void ji(int x, int y)//求积函数
{
printf("%d\n", x * y);
}
void cha(int x, int y)//求差函数
{
printf("%d\n", x - y);
}
int main()
{
int x, y;
scanf("%d%d", &x, &y);
he(x, y);//求和函数
ji(x, y);//求积函数
cha(x, y);//求差函数
return 0;
}
第一个求和函数:
1.函数有两个int型的参数,要上传两个整数
2.函数返回值类型是void,所以不返回值
3.函数的功能是求这两个整数的和,并打印。(函数体)
现在我们修改这个函数,从另一个方向学习。
int he(int x, int y)//求和函数
{
return x + y;
}
int main()
{
int x, y;
scanf("%d%d", &x, &y);
int he = he(x, y);//求和函数
printf("%d",he);
return 0;
}
1.函数有两个int型的参数,要上传两个整数
2.函数返回值类型是int,所以返回一个整数
3.函数的功能返回两个数的和(return x+y;)
4.形参和实参
被传递的量叫实参,传递到函数中的量叫形参。
形参,顾名思义,是形式上的参数。如果函数调用时用到了形参,才需要向内存申请空间,否则都不用申请空间。
申请空间意味着实参和形参的量虽然相同,但是在内存中的位置不同。形参只是实参的一份临时拷贝。
5.return语句
1.return接表达式,会先算表达式,后返回该值
2.return不接任何东西,仅适用于返回值为void型的函数
3.如果返回值与返回值类型不一致,会将返回值的类型强转
4.遇到return,函数结束
5.如果在函数内用了if等分支语句,要保证每种情况都有return返回
6.数组作函数参数
1.数组传参,实参是数组名,形参可以写成数组的形式
2.形参是一维数组时,元素个数可省略
3.形参是二维数组,行可以省略,但是列不能
4.传参时,没有创建新的数组
5.形参与实参操作的是同一个数组
7.嵌套调用
在一个函数中调用另一个函数叫嵌套调用
8.链式访问
将一个函数的返回值用作另一个函数的参数叫链式访问
9.函数的声明和定义
函数声明:交代一个函数的名字,参数类型,返回值类型
举例:int my_strlen(char* p1);
1.若将函数写在主函数下方,要在主函数上方声明,声明只需交代参数类型和返回值类型即可。(如图)
2.一般将函数的声明放在头文件中,函数的实现放在源文件中