C语言中的函数(超详细)
【前言】
一、函数概述
我们都知道函数是数学里的重要组成部分,数学中我们常见到函数的概念,但是你了解C语言中的函数吗?
其实函数就相当于一个子程序,那什么是子程序呢?
二、C语言中函数的分类
1.库函数
1.1什么是库函数?
1.2库函数是C语言提供的吗?
1.3为什么会有库函数呢?
1.4那怎么学习库函数呢?
这里我给大家推荐一个可以很好查到有关库函数的网站链接:可查到库函数资料
简单的总结,C语言常用的库函数都有:
注!!!
库函数必须知道的一个秘密就是:使用库函数,必须包含 #include 对应的头文件。
2.自定义函数
如果库函数能干所有的事情,那还要程序员干什么?
所有更加重要的是自定义函数!!!
自定义函数和库函数一样,有函数名,返回值类型和函数参数。
所谓自定义就是这些都是我们自己来设计。这给我们自己一个很大的发挥空间!!!
函数的组成:
我们举一个例子:写一个函数可以找出两个整数中的最大值。
#include <stdio.h>
//get_max函数的设计
int get_max(int x, int y)
{
return (x > y) ? (x) : (y);//三目运算符:x大于y返回x,x小于y返回y
}
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
int max = get_max(num1, num2);
printf("max = %d\n", max);
return 0;
}
这里我们输入a=10 b=20结果是
正确的,说明我们自己定义的函数还是比较成功的哈👏
上面可以看到,我们定义的一个函数get_max()是为了得到一个最大值,而get max也能理解为这个意思,由此可以看出咱们在定义函数的时候取的名字尽量要有意义,不然别人读你的代码根本不知道你这写的什么函数,你要知道,我们写代码是要给别人看的,你总不能写个乱七八糟的函数,让你写东你写个西在上面,你让别人怎么看呀,是不是。所以还是要考虑别人的感受!!!
扯远了哈,咱们继续
三、函数的参数
1.实际参数(实参)
- 真实传给函数的参数,叫实参。
- 实参可以是:常量、变量、表达式、函数等。
- 无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。
2.形式参数(形参)
比如上面中的get_max(int x, int y),其中x和y就是形式参数。
我们可以简单的认为:形参实例化之后其实相当于实参的一份临时拷贝。
四、函数的调用
1.传值调用
2.传址调用
举个例子:交换两个数的值
void Swap2(int*p1, int*p2)
{
int tmp = 0;
tmp = *p1;//tmp = a;
*p1 = *p2;//a = b;
*p2 = tmp;//b = tmp;
}
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
printf("交换前:a = %d b = %d\n", a, b);
Swap2(&a, &b);
printf("交换后:a = %d b= %d\n", a, b);
return 0;
}
这里我们输入a=10 b=20
说明我们定义的函数是对的,但是我们看上面Swap(&a,&b)中使用的是取地址a和取地址b,这是为什么呢?为什么不用Swap(a,b)呢?
因为我们需要的是交换a、b的值,仅仅使用传值调用的话只能改变实参的表面数值,而实参内部没有被传到形参,当形参执行函数时只带上了实参的数值,而形参内部还是形参本身,那么虽然输出的结果是符合要求的,但是内部功能可能会有差异。所以我们采用传址调用,这样我们把a、b的地址传到形参里面,形参就能根据地址输出我们想要的效果。这么说,你该懂了吧!那么能否奉上阁下的一件三连呢!不要辜负我的一番苦心啊!!!
五、函数的嵌套调用和链式访问
1.嵌套调用
void x()
{
}
void y()
{
x();
}
int main()
{
y();
}
我只是举个例子来表示嵌套调用,你们可不要这么写哈。
注意!!!
函数可以嵌套调用,但是不能嵌套定义。
2.链式访问
六、函数的声明和定义
1.函数声明
例:
int get_max(int x, int y);//<font color = green>函数声明
int main()
{
get_max(a,b);
}
加在最上面或者get_max(a,b)上面都可以。
2. 函数定义
例:
int get_max(int x, int y)
{
return (x > y) ? (x) : (y);//三目运算符:x大于y返回x,x小于y返回y
}
这就是函数定义。
学习了函数声明和函数定义以后,我们是不是就知道怎么使用函数了,好,那我们就来写一道题:写一个函数,完成2个整数的相加
这里我们可以创建一个函数Add(),它要完成两个数相加,那么函数就可已定义为:
int Add(int x, int y)
{
return x + y;
}
函数声明为:
int Add(int x, int y);
那么我们就可以开始写这个程序,代码就是
#include<stdio.h>
int Add(int x, int y)
{
return x + y;
}
int Add(int x, int y);
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
int ret = Add(a, b);
printf("%d\n", ret);
return 0;
}
输入a=10 b=20
运行结果:
到这里你是不是觉得没什么问题,确实没什么问题哈。
但事实上,在工程里面是这样用的吗?
如果你只是写一个文件的话,这样写是没有任何问题的。
但是我们未来在工程中,代码是比较多的,如果还是用我们上面这种方法的话,那可就太繁琐了,所以,我们的函数一般是放在.h文件中声明,在.c文件中实现的!
下面我给大家来演示一遍(VS2019)
- 新建一个头文件add.h
因为头文件是进行函数的声明,所以在头文件中输入函数声明
- 新建两个源文件add.c和test.c
add.c里面用来定义我们的函数
test.c是我们自己输入跑程序要用的代码
程序跑起来就是这个样子
七、函数递归
今天超级详细的C语言中的函数就分享到这里啦!希望各位多多点赞收藏评论!!你的支持是我最大的动力!!!