目录
1.函数是什么
定义:是一个大型程序的某部分代码,有一个或者多个语句块组成,它负责某项特定任务,而相较于其他代码,具备相当的独立性。一般会有输入参数并有返回值,提供对过程的封装和细节的隐藏
2.C语言中函数的分类
2.1 库函数
为了支持可移植性和提高程序的效率,c语言提供了频繁且大量用到的函数作为库函数,例如printf,scanf,strcpy等,方便程序员进行软件开发。
介绍几个常用的学习库函数的网站及软件
https://cplusplus.com 和 C++ 参考手册 - cppreference.com
MSDN: 链接:https://pan.baidu.com/s/1zFCnWtyfrYZhLOMo1JtDhA?pwd=2023
提取码:2023
MSDN 解压后直接安装然后打开即可。
如何使用文档来学习函数?
例如学习strcpy函数,打开https://cplusplus.com,找到reference -> C library:,找到strcpy函数,右侧为详细信息。
MSDN方法:
2.2 自定义函数
自定义函数和库函数一样,有函数名,返回值类型和函数参数,但是不一样的是这些都是由程序员自己设置,这就给我们提供了很大的发挥空间。
函数的组成:
ret_type fun_name(para1,*)
{
statement;//语句
}
ret_type;//返回类型
fun_name;//函数名
para1;//函数参数
例子一:
需要注意的是,传参与受参时的参数类型要保持一致,并且不能用原来参数名,需要创建新的变量来接受传入的参数,例如上图中新的容器就是int x,int y;当返回值有要求时,注意函数的返回类型,如果没有要求,则int 可以写为void。
一个函数如果不写返回类型的话,默认返回int型。
例子二:
这是一个交换a,b值的一段错误代码,可以看到程序运行结果并没有交换a,b的值,刚接触函数时最容易忽略的就是形参与实参的问题,这里通过调试来解释:
可以看到虽然a,b传给了x,y,表面上看已经交换了数值,但是通过&a,&b,&x,&y发现,x与y并不是真正的a,b,而是进入函数后新开辟了两块空间放了a,b的值,此时交换的x,y并没有影响到真正的a,b。
另一种说法是:主函数里调用Swap函数中,参数为实参,而主函数外的Swap函数中的参数叫做形参,Swap在被调用的时候,实参传给形参,其实形参是实参的一份临时拷贝,改变形参并不能改变实参。
改进:
当传入参数为(&a , &b),同时,传参时用(*pa,*pb)接住,因此这次传入的是a,b的地址,是可以远程控制到a,b的实际内容。
那么什么时候应该传地址呢?
一般来说设计函数时,不需要更改函数外部参数的时候不需要传地址;而当想要通过函数内部控制到外部的参数时,应该传入地址才可以实现。
3.函数的调用
3.1传值调用
Swap(a,b);
函数的形参和实参分别占有不同的内存块,对形参的改变不会影响到实参。
3.2传址调用
Swap(&a,&b);
传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式,这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量。
4.举例(易)
4.1题目:输出100-200之间的素数,及个数。
素数:素数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。
假设判断n是不是素数
方法有两个 ① 用for循环从2——n-1,逐个验证n是否被这些数字整除,若被整除,则n不是素数
②一个结论是,一个数的因子必有一个小于开平方。由此,可以只验证2——开平方n
4.2输出1000-2000的闰年,及个数
闰年是指可以被4整除但是不能被100整除,或者可以被400整除。
改进128-133行:
return ((n % 4 == 0 && n % 100 != 0) || n % 400 == 0);
4.3折半查找
要注意的是,数组arr传参,传递的不是数组本身,而仅仅是数组首元素的地址。所以不能在自定义函数内部求数组大小,只能在外部求好大小后传参给自定义函数。
4.4要求每次调用Add函数时,num加一
5.函数的嵌套调用和链式访问
5.1函数的嵌套调用
函数不可以被嵌套定义,但可以被嵌套调用。
嵌套定义:❌
int test1()
{
int test2()
}
嵌套调用:✔
void test3()
{
语句;
}
int test2()
{
test3();
}
int main()
{
test 2();
return 0;
}
5.1函数的链式访问
把一个函数的返回值作为另一个函数的参数。
例如:
再给一个有趣的例子;
此时应该输出什么结果呢?
答案是:4321。
原因:我们运用文章开头的方法找到printf函数的详细说明,可以看到printf的返回值是int型,而且这个返回值指的是打印出字符的个数。这样我们再来看这行代码,缓缓嵌套到最后一层,肯定会首先打印出43,而此时它的返回值就是2,因为是两个字符,然后再打印出2,同理,最后就是1。