距上一次整理知识点,已经过去了差不多两周
今天,比较系统的C语言知识点,它又来了!✨
- 一、函数是什么
- 二、C语言中函数的分类
- 1、库函数
- 2、自定义函数
- 三、函数的参数
- 1、实际参数(实参)
- 2、形式参数(形参)
- 四、函数的调用
- 1、传值调用
- 2、传址调用
- 五、函数的嵌套调用和链式访问
- 1、嵌套调用
- 2、链式访问
- 六、总结
我们知道,数学中有各种各样的函数,那么,你了解C语言中的函数吗?
维基百科中对函数的定义:子程序
其实,一个完整的程序就像一个大工厂,它由各种各样的函数组成,这些函数就像一个个小的车间,也可以称之为“子程序”!
C语言中函数大致分为两类
1、库函数为什么会有库函数呢?
- 我们知道在我们学习C语言编程的时候,总是在一个代码编写完成之后迫不及待的想知道结果,想
把这个结果打印到我们的屏幕上看看。这个时候我们会频繁的使用一个功能:将信息按照一定的格
式打印到屏幕上(printf)。- 在编程的过程中我们会频繁的做一些字符串的拷贝工作(strcpy)。
- 在编程是我们也计算,总是会计算n的k次方这样的运算(pow)。
像上面我们描述的基础功能,它们不是业务性的代码。我们在开发的过程中每个程序员都可能用的到,为了支持可移植性和提高程序的效率,所以C语言的基础库中提供了一系列类似的库函数,方便程序员进行软件开发。
那么我们应该怎么学习库函数呢
下面给大家提供一个网站,任何库函数都可以在里面找到!
www.cplusplus.com
里面对每一个函数都有非常详细的解释,快去学习吧!!!
C语言中经常用到的函数有:
IO函数
字符串操作函数
字符操作函数
内存操作函数
时间/日期函数
数学函数
其他库函数
2、自定义函数但是库函数必须知道的一个秘密就是:使用库函数,必须包含 #include 对应的头文件。
我们知道,程序员这个职业之所以存在,就是因为有很多程序仅仅依靠库函数是无法实现的,所以我们往往要根据需求自己来定义有相应功能的函数。
自定义函数和库函数一样,有函数名,返回值类型和函数参数。但是不一样的是这些都是我们自己来设计。这给程序员一个很大的发挥空间。
函数的组成:
下面来举个例子,写一个函数可以找出两个数中的最大值
#define _CRT_SECURE_NO_WARNINGS #includeint Max(int x, int y) { return (x > y) ? x : y; } int main() { int a = 0; int b = 0; scanf("%d %d", &a, &b); int max = Max(a, b); return 0; }
再举个例子,写一个函数交换两个数的值:
#define _CRT_SECURE_NO_WARNINGS #includevoid swap(int x, int y) { int tmp = x; x = y; y = tmp; } int main() { int a = 0; int b = 0; scanf("%d %d", &a, &b); printf("交换前:a=%d b=%dn", a, b); swap(a, b); printf("交换后:a=%d b=%dn", a, b); return 0; }
但是,这样的代码真的是正确的吗???
下面来看一下运行截图:
可以看到,输入的两个值并没有进行交换
所以上面的方法是错误的,大家可千万不要完美地记住了错误的方法啊
下面来看正确的方法:
#define _CRT_SECURE_NO_WARNINGS #includevoid swap(int* x, int* y) { int tmp = *x; *x = *y; *y = tmp; } int main() { int a = 0; int b = 0; scanf("%d %d", &a, &b); printf("交换前:a=%d b=%dn", a, b); swap(&a, &b); printf("交换后:a=%d b=%dn", a, b); return 0; }
运行结果:
这样就顺利的完成了两个数的交换!
那么上面两个代码到底有什么区别呢
在下面的函数的参数和函数的调用中,我们来进行解答!
形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内存单元),所以叫形式参数。形式参数当函数调用完成之后就自动销毁了。因此形式参数只在函数中有效。
这里需要注意的是,形参只是实参的一份临时拷贝,改变形参并不影响实参的值!!!
这也是为什么上面的第一个代码达不到交换效果的原因
下面做更深一步的解释:
四、函数的调用 1、传值调用 2、传址调用这里可以看到 Swap1 函数在调用的时候, x , y 拥有自己的空间,同时拥有了和实参一模一样的内容。
所以我们可以简单的认为:形参实例化之后其实相当于实参的一份临时拷贝。
下面用一个比较通俗易懂的方法解释一下:
函数和函数之间可以根据实际的需求进行组合的,也就是互相调用的。
运行效果:
其实,上面的代码可以解释为----我们可以在主函数中调用各种函数,同样也可以在其他函数中调用函数。
函数可以嵌套调用,但是不能嵌套定义。
把一个函数的返回值作为另外一个函数的参数。
#define _CRT_SECURE_NO_WARNINGS #includeint Max(int x, int y) { return (x > y) ? x : y; } int Add(int x, int y) { return x + y; } int main() { int a = 1; int b = 2; int c = 5; int ret = Max(Add(a, b), c); printf("ret=%dn", ret); return 0; }
运行效果:
前两周真的是因为很忙,所以函数知识点的整理就往后推了推,这只是函数的第一章,剩余的内容我将会在第二章中写完,还请小伙伴们支持!
在这一章中,比较重要的就是函数的传值和传址调用之间的区别。我还是建议大家最好用传址调用,因为这样不用再为形参开辟一个和实参一样的空间。当实参所占空间较大时,它的作用就更加显著了!
好了,今天的分享就到这里了,希望大家一起进步!下次再见!



