一、函数是什么
在数学中我们经常可以见到函数,但是,你知道C语言中的函数吗?
定义:子函数,是一个大型程序中的某部分代码,有一个或多个语句块组成。他负责完成某向特定
任务,相对于其他代码,具有相对独立性。
二、C语言中函数的分类
C语言中,可以将函数分成两大类:库函数、自定义函数
三、库函数
为什么要有库函数?
我们日常在写代码的过程中,有一些功能需要频繁的使用。比如说,我们想要打印一下某某数据,我们需要做一些字符串的拷贝工作,我们想要计算某某字符串的长度...如果C语言中没有库函数,那么每一个程序员想要实现这些功能的时候,都需要自己去写一个代码去实现;这样不但浪费了时间,而且写出的代码是冗余的(相同功能的代码出现了好几份)。
于是,这些具有简单的基础的功能,把它封装成库函数,每一个程序员都可以用到,既使得开发效率得到了提升,让代码更加标准化,又减少了代码的冗余等等优点。
那么,我们怎么学习库函数呢?
下面推荐一个常用的网站:
cplusplus.com - The C++ Resources Network
下面介绍几个库函数;
strcpy:
当然,有的自带翻译(不过可能不是翻译的特别准确,最好自己翻译翻译)
当然,arr2里面的\0也拷贝到arr1里面去了,这个可以通过调试看见。
memset:
使用库函数时,必须要引用头文件。
四、自定义函数
如果库函数可以做任何事情,那么还需要程序员干什么?
下面我们来介绍一下自定义函数:
自定义函数是由程序员自己定义写出来的函数
下面我们来举一个例子(写一个函数,求出两个数中的较大值)
下面我们再举一个例子(写一个函数,交换两个数的内容)
没有函数的:
有函数的:
没有达到交换的效果,说明有问题了。
调试结果出来了,x,y确实交换了,但是无法传递给下面的a,b。
原因是:实际参数a和b,传递给形式参数x,y的时候,形参将是实参的一份临时拷贝,改变形
参变量x,y,不会影响实参a和b
从空间角度上来说,a,b和x,y之间是没有联系的,要想解决这个问题,就需要它们之间建立联系:
这让我们想到了初始C语言的地址方面的内容:通过地址找到相关的内容。
这下,问题就解决了。
五、函数的参数
实际参数(实参):
真实传递给函数的参数,叫实参;
实参可以是:常量、变量、表达式;
无论是何种类型的量,在进行函数调用时,他们必须有确定的值,以便把这些值传递给形参。
形式参数(形参):
形式参数是指函数明后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内存单元),所以叫形式参数;
形式参数当函数调用完成后就自动销毁了,因此形式参数只有在函数中有效。
六、函数的调用
传值调用:
函数的形参和实参分别占有不同内存块,对形参的修改不会影响实参(形参是实参的一份临时拷贝)
传址调用:
1、传值调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的形式;
2、这种传参方式可以让函数和函数外边的变量建立起真正的联系(函数内部可以直接操作函数外
部)。
什么时候传值调用?什么时候传址调用?
不需要改变实参的时候传值调用;需要改变实参的时候传地调用。
六、函数练习
1. 写一个函数可以判断一个数是不是素数。2. 写一个函数判断一年是不是闰年。3. 写一个函数,实现一个整形有序数组的二分查找。4. 写一个函数,每调用一次这个函数,就会将 num 的值增加 1 。
写一个函数可以判断一个数是不是素数。
写一个函数判断一年是不是闰年。
闰年的条件:
第一种:在不可以被100整除的条件下,可以被4整除的是闰年
第二种:可以被400整除的是闰年
写一个函数,实现一个整形有序数组的二分查找。
写一个函数,每调用一次这个函数,就会将num的值增加1。
七、函数的嵌套调用和链式访问
函数的嵌套调用:
函数可以嵌套调用,但是不可以嵌套定义
函数的链式访问:
把一个函数的返回值作为另外一个函数的参数
俗称:套娃
可以看一看这个网站:
八、函数的声明和定义
函数的声明:
1.告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体是不是存在,无
关紧要。
2.函数的声明一般出现在函数的使用之前。要满足先声明后使用。
3.函数的声明一般要放在头文件中的。
函数的定义:
函数的定义是指函数的具体实现,交代函数的功能实现。
举个例子:
平常我们写代码:
但是在一些教科书上,会出现主函数在自定义函数前面的情况(这就需要函数的声明)
先声明后使用
上面的是在教科书里出现的,正经工程里面的函数的声明都是在头文件里面
当然,写在.h文件里面的声明可以加上extern,
extern int Add(int x,int y);也是可以的哦
分模块写的好处是什么?
1、可以多人协作
2、可以做到封装和隐藏