本帖最后由 夜色星空 于 2017-1-20 01:57 编辑
在c语言中,为了体现某段程序的可复用性与将较大的程序进行分割便于实现
函数便发挥了其优越的作用
它可以将一系列语句进行封装
封装完以后的一个整体,我们称之为函数
一系列函数的集合,我们称之为库
C语言编译器标准库中的<stdio.h>
提供了诸如
printf();
scanf();
等函数,我们不需要这些函数是如何编写的
但我们知道如何去使用
这样,大大节省了时间成本
但光有这些标准库函数还满足不了我们的需求
所以,我们就学习如何去制作一个函数
用标准库函数去搭建自己的函数
它的可复用性体现在
就像你可以多次调用printf()那样,多次调用你自己的函数
如果某段程序需要反复使用,不妨将其封装成一个函数,以节省时间与空间成本
那么这里就有了一个问题
随着变量中的值不一样,一段程序运行结果也必定不一样(除非这段代码不使用变量,但大多都使用了)
那么我们有没有一种方法解决这个问题?
有,传参
就相当于给数学当中的F(x)中的x进行赋值
只不过形式有些区别
如:
先看main()(因为它是程序运行的起始)
声明了一个整形a,初始化为0(初始化:声明时赋值)
将a的值给fun()中的x(此时,称a为实参,x为形参,a=x称为传参)
原因:a的值为实际的值,而x只规定了fun函数需要一个int类型的参数所以叫形参
把a中的值赋给x叫做传参,传递参数
那么此时在fun函数中x就相当于main函数中的a了
经过fun()的运行加工已经得出了我们想要的值
然而,如何将fun()中正确的值传给main()
这时,我们用到了return(返回)
return x;
也就是将x的值返回调用函数的地方
也就是main()中
那么此时
a=fun(a);
就相当于
a=x;(return x;中x的值)
(PS:可以声明多个形参,进行传参,但返回值一般只有一个)
问:为什么不能直接修改a的值而必须经过传参,先修改x,再传给a?
答:因为使用函数有以下几种限制
1.当调用函数时,机器会开辟一个内存空间供给调用,当调用结束时释放空间(static声明除外)
2.在函数中声明的变量,其作用域仅限于本函数(除非使用关键字扩展作用域)
3.函数只能嵌套调用,不能嵌套定义
4.函数应先声明,后调用
先说第一点:
制作一个函数,就像制作一个模板的图纸,当你使用这个模板时(函数调用),机器才会将模板做出来(构建函数)(貌似是为了减少内存占用,减少空间成本)
当使用完毕,机器将模板毁掉(内存释放)
第二点:
通俗地说,就是你在哪对花括号内声明的变量,就只能在那对花括号内部使用
如:
这个运行不了,会报错
然而
如:
这种,就不会报错
因为a的作用范围为main()
而printf()函数在其作用范围内
还有一种声明
如:
此为全局声明,所有函数都可以进行使用更改
第三点:
嵌套声明,就是在某函数定义域内(花括号内)再声明一个函数,这是不被允许的
嵌套调用,就是在某函数定义域内调用其它函数(main函数无法被其它函数调用,否则就在逻辑上形成了死循环)
第四点:
如果足够细心的话,就会发现,我的第一张图片中,将fun()写在了main()前面
这就是函数的先声明,后调用
将索要调用的函数蓝图先画好,然后调用时机器才能做模子
为了使结构更清晰
有时也使用如下方法
先将函数头写在调用函数前(分号!分号!分号!)
然后在其下方写函数体
(也可以说是先将蓝图名告诉机器,调用时让机器自行寻找对应蓝图)
这样就可以解释问什么添加头文件要在最上方了
近期还遇到了一种在函数内进行函数声明的例子
查了一下,确实可以(貌似是谭浩强的书?可惜手里没有)
但个人认为非常影响程序整体框架,增加代码长度(每一个使用此函数的都必须先声明),不推荐
小结:
调用函数输出字符'a'-'z'
(参考程序见附件)
|