🚀write in front🚀
🔎大家好,我是gugugu。希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎
🆔本文由 gugugu 原创 CSDN首发🐒 如需转载还请通知⚠
📝个人主页:gugugu—CSDN博客
🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝
📣系列专栏:gugugu的系列专栏——CSDN博客
✉️我们并非登上我们所选择的舞台,演出并非我们所选择的剧本📩
前言
博主被催更了,有小伙伴私信博主更一期关于C语言函数的教学,谁让我们是宠粉博主呢,啥也别说了,加更吧!
gogogo!!!
一、函数介绍
C语言中的函数叫做函数,但是和高中我们数学中所学习的函数还是有区别的,C语言中的函数其实就是子程序,是一个个小模块,也就是一个独立的功能。
通过函数包装,可以用一个函数,多次使用该函数实现同一功能。
经过一段时间的学习之后,我们可能写程序都离不开函数了。
二、函数分类
1、库函数
顾名思义,库函数就是封装在编译器内部的一些函数,各自实现不同的功能,可以在很大程度上帮助程序员提高写代码的效率和代码的质量。
库函数存在很多,我们不需要强行记忆,多多使用就会自然记住,遇到不会的库函数可以去查询。
查询方式在前文有提到过,主要有两种办法
a.进入网站:cplusplus
b.下载msdn软件,在软件内查询。
注意,在使用库函数时,需要在最开头引用头文件,头文件可通过上述两种方式查询
2、自定义函数
自定义函数非常重要,有了自定义函数,我们程序员就成为了魔术师,可以通过自己编写自定义函数达到自己希望实现的功能。
自定义函数的组成如下
函数返回类型 函数名(形参)
{
函数体
}
本文我们将详细讲解自定义函数。
三、函数的参数、
函数的参数分为形参和实参,及形式参数和实际参数
1、实际参数(实参)
实际参数是我们传过去的参数
假设函数为add
add(a,b);
那么在这个函数里面,实参就是a和b
2、形式参数(形参)
形式参数就是接受我们传过去的实参的参数
假设函数还是add
int add(int x,int y)
{
return x+y;
}
在这个函数里形参就是x和y了
3、形参和实参之间的关系
形参是实参的一份临时拷贝,对形参的改变不会影响实参。
这句话可以这么理解,就是把实参的内容给复制了一下子,暂时放在形参里面,等待进行操作。
我们从地址的角度更容易理解这些话
可以看到a和x,b和y的数值虽然一样,但是地址却不一样,这就说明,形参只是实参的一份临时拷贝,改变形参不影响实参,那若何改变通过形参改变实参呢?这就得提到传址了,后文会介绍。
形参和实参的名称可以一样,但是地址不一样
形参在使用函数时,申请存储空间,在函数使用完毕时,归还存储空间。
四、函数的调用
1、传值调用
传值调用时,无法通过形参改变实参,顾明思义,肯定是传递值给形参。
皮一下,重新回来。
写个代码看看。
int add(int x,int y)
{
return x+y;
}
int main()
{
int a=10;
int b=20;
int ret=add(a,b);
printf("%d\n",ret);
return 0;
}
这里就是传值调用,将实参a和b的值传递个形参x和y,返回一个值,这里只是对a和b进行操作,却并没有改变a和b的属性。
2、传址调用
传址调用,顾名思义,就是将地址传递过去,用解引用操作符,指向对象,对对象进行操作,从而改变被指向的对象的属性。
写一个交换两个数的函数,如果是使用传值调用的话,是无法改变值的属性的,所以无法达到交换的效果。
这里就更加适合传址调用了、
void swap(int* x,int* y)
{
int tmp=*x;
*x=*y;
*y=tmp;
}
int main()
{
int a=10;
int b=20;
swap(&a,&b);
printf("%d %d\n”,a,b);
return 0;
}
这就是传址调用
注意传址调用时,形参需要是指针变量,通过解引用操作符去,找到对象。
五、函数的嵌套使用和链式访问
1、嵌套使用
函数的嵌套使用时非常重要的一个方法,后续会设计到递归啥的,可以说是函数必备,好好学。
函数的嵌套使用
嵌套使用,通俗来说就是函数里面再用函数,
这个很好理解,写个代码就可以理解
#include<stdio.h>
int main()
{
printf("Hello world\n");
return 0;
}
这里一个main函数里面嵌套了一个库函数printf
这就是嵌套了,函数里面套函数,当然自定义函数也是这样。
2、链式访问
链式访问是指将一个函数的返回值作为另一个函数的参数进行访问。
写一个很有意思的代码看看。
#include<stdio.h>
int main()
{
printf("%d", printf("%d", printf("%d", 43)));
return 0;
}
不知道有没有小伙伴能够说出来会打印什么吗?
答案是4321
来,我们解释一下为什么是4321,这是一个很经典的链式访问
这里我们先了解一下printf函数的返回值,printf返回在屏幕上打印的字符的个数。
首先,肯定打印43,接着返回值为2,触发链式访问,第二次打印2,返回值为1,再次触发链式访问,打印1 。
所以最后打印4321.
六、函数的声明和定义
1、函数的声明
-
函数的声明主要的目的在于告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。
-
但是这个函数具体存在不存在,函数声明决定不了。
-
函数的声明一般出现在函数的使用之前。要满足先声明后使用。
-
函数的声明一般要放在头文件中的。
void swap(int x,int y);
这就是声明了,声明的格式就是函数头加一个分号
2、函数的定义
函数的定义其实就是写函数的过程,我们写的整个函数,完成函数头加函数体的过程就是函数的定义。
注意函数可不能嵌套定义
这样子就是错的
int add(int x,int y)//加法函数
{
return x + y;
int sub(int x, int y)//这个减法函数被嵌套定义在了加法函数内部,这种写法是错的
{
return x - y;
}
}
这里就犯了嵌套定义的错误。
正确的定义方法应该是这样子的
int add(int x,int y)//加法函数
{
return x + y;
}
int sub(int x, int y)//减法函数
{
return x - y;
}
3、模块化编程
模块化编程是分重要,在出现大规模编程时,模块化编程必不可少。
模块化编程在上篇文章扫雷中就是一个案例
点击这里即可查看 扫雷
我们在写代码的时候可能会想:我把所有的代码写在一个源文件中,这样找起来不就方便了吗。
其实,这样的习惯对日后程序的开发是不利的。
我们的社会是有各自的分工的,当我们在开发一个程序的时候,我们往往只需要负责一个大的工程中的部分内容,比如一个人去写主程序,一个人写函数等等,而我们将工程的各个部分分开就可以更快地快找到bug并对应修复。
这样,当我们写一个函数时,就需要这样的文件分配:
- 函数声明——头文件.h
- 函数定义——函数实现的源文件.c
每一个函数都可以分成这两个文件编写,也可以几个函数写在两个文件中。
今天的分享到这里结束啦,谢谢观看
至于递归就放在后面再讲吧,这个就比较复杂啦。
!!!!!!!!点个三连吧!!!!!!!
!!!!!!!!!求关注!!!!!!!