文章目录
一.函数
1.函数的定义
1.不同于数学意义上的函数,在计算机科学中,函数又叫子程序,是一个大型程序的某部分代码,由一个或者多个语句块组成。它负责完成某项特定的任务,而且相较于其他代码,具备相对的独立性。
2.一般会有输入参数并有返回值,提供对过程的封装和细节的隐藏。这些代码通常被集成为软件库。
软件库就是我们所说的库函数,它为我们服务,提供我们所需的功能,但我们并不知道其过程和细节。
2.函数的分类
1.库函数
2.自定义函数
2.1库函数
为什么会有库函数?
一些基本的函数如打印,输入,计算等,为了支持可移植性和提高程序的效率,所以C语言的基础库中提供了一系列类似的库函数,方便程序员进行软件开发。
标准库
标准库提供了C语言的库函数
标准库包含各种头文件,头文件中又包含各种库函数。
你可以在clpusplus.com上查找
比如在stdio.h中就提供了scanf和printf等函数
库函数的分类
- 输入输出函数,如scanf、printf
- 字符串操作函数,如strlen、strcpy
- 字符操作函数,如isalpha(判断是否是字母)、toupper和tolower(大小写转化)等
- 内存操作函数,如memcpy、memset
- 时间和日期函数,如time
- 数学函数,如sqrt(开方)、pow(幂函数)
以上的这些函数以后均会讲到,不用担心
利用文档来学习库函数
我们要学会利用文档来学习库函数,即懂得查询库函数的资料来了解函数
例子
我们要学习一个函数叫strcpy。
- 首先,在cplusplus上查找他的相关资料。了解其函数名的意义、参数的类型和数目、返回值和头文件。
个人认为要有一点点的英语阅读能力,这些都不难理解的。
1.函数的作用是把一个字符串拷贝到另一个字符串。第一个参数是目标数组的首元素地址,第二个参数是要拷贝的数组的首元素地址。返回目标数组的首元素地址。
2.一定要注意拷贝的数组的大小要小于目标数组的大小。
- 了解到函数的基本信息后,就先写个代码试试
解读:把arr2的内容拷贝到arr1中,再用printf把数组1打印出来,一直打印到’\0’为止,strcpy也可以忽略其返回值。
调试
按F10键或fn+F10进行调试,再在测试->窗口->监视->输入你要监视的值即可。
在后期会讲到怎么调试,现在只是简单的介绍。
学习库函数的其他工具
2.2自定义函数
为什么会有自定义函数
C语言提供的库函数不足以满足我们对代码的需求。所以C语言给予程序员自我设计函数的能力,同时给程序员很大的发挥空间。
函数组成
ret_type fun_name(para1, * )
{
statement;//语句项
}
ret_type是返回类型
fun_name是函数名
para1是参数
{}内的是代码块
整体上与库函数相同
注意
我们可以自主命名函数,但这不意味着我们可以滥其函数名,这里有起函数的几条建议:
- 起有意义的名字,方便你和别人能读懂,比如创建一个判断素数的函数,可以用函数名is_prime
- 尽量不用拼音,起英文名(并不是说拼音不好)
- 要么小写字母和下划线组合,要么大写字符和小写字母组合,如判断闰年的函数名is_leap_year或者IsLeapYear,这样更方便他人观看理解函数的作用
例子
这是一个判断两个数大小的函数
函数的返回类型为int,参数是两个整形。
过程就是把a和b传给函数,然后函数用x和y来接受。
定义函数要标明函数的返回类型,参数类型,参数数目。
3.函数参数
3.1实际参数
- 实际参数是调用函数时传递给函数的参数,如上例中的a和b。
- 实际参数必须是清晰的值,可以常量、变量、表达式、函数。
如图中的Add函数,他的参数是常量,表达式,函数,但参数都是确定的值。
3.2形式参数
-
形参就是函数定义时括号内的变量,如上例中的x和y。
-
形参必须要有类型,如果没有数据类型就写void。
-
形参和实参的名字可以相同,也可以不同。
-
为什么叫形参?因为形参只有在函数被调用时才创建,函数没被调用时,形参没被分配内存,只是形式上的存在,所以叫形参。
这也解释了为什么给函数传递数组时,形参数组可以不指定数组元素个数。在函数为被调用之前,我们不需要为形参数组分配内存。 -
为形参分配内存时叫形参的实例化。
-
形参实例化就是实参的一份临时拷贝。(在传值调用中重点讲)
-
形参在函数调用时开辟空间,在函数调用结束后销毁。
4函数调用
- 传值调用
- 传址调用
4.1传值调用
例子
写一个函数,求两个整数的最大值
传值就是简单地把变量传给函数。
它的概念不好定义,得与后面的传址调用比较才容易说明
再看一个例子
例子
写一个函数,交换两个整数
按照我们先前的想法,交换后的a和b的值应该互换才对,为什么会出现这种情况?原因是传值调用只是传给函数一份拷贝,我们在函数中对这份拷贝进行的操作不会影响到我们传给函数的变量。
还不懂?没关系。上图!
从图中可以看出,在调用函数时,形参是实参的一份临时拷贝。我们对形参的操作并不能影响实参。
那该如何解决无法改变实参的问题?这时该我们的传址调用登场了。
4.2传址调用
字面意思,就是把地址传给函数,让函数通过地址访问到实参,从而对实参进行操作 。
例子
既然传给函数的是地址,那我们就得用指针来接受。既然要对指针进行操作,我们就得用解引用操作符(*)。
同样画图理解
对x解引用得到a,对y解引用得到b,然后就可以交换a和b的值。
4.3总结
现在,我们可以来总结下两种函数调用的作用:
- 传值调用:函数的形参和实参分别占有不同内存块,对形参的修改不会影响实参。
- 传址调用:这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操
作函数外部的变量。
总结
今天介绍了函数的一部分内容,如定义,分类,参数,参数的传递等等,接下来我们还会介绍到C语言两大重点之一的递归。
如果有不对的地方,请多多指正!