1.概念:函数又称为子程序,一个C语言程序是由无数个子程序组成的,每个函数利用一小段代码实现一个功能,完成某个特定的任务(一个大的任务分解成多个小任务来完成)
2.分类:库函数和自定义函数
1.标准库:C语言国际标准ANSIC提供一些常用函数的用法,参数,返回类型,函数名等,称为标准库,但是只是提供还没有进行实现
2.库函数:各种编译器对标准库里的函数进行实现,这些函数称为库函数
3.库函数根据功能分类,需要对头文件进行声明
4.库函数的使用:
(1)原型
(2)功能
(3)返回值和参数
1.自定义函数四要素:返回类型,函数名,函数参数,函数体
2.返回类型:计算结果的类型
(1)如果不需要返回值,可以写void(空)
注:其在return的时候可以直接就写return;适用于不需要返回值但又需要提前返回的情况
(2)如果返回类型和return的值不一致,则会隐形将返回的值转化为返回类型的类型
(3)如果没有写返回类型,则默认为int类型,并且没有return也会返回随机值
(4)如果写了返回类型但是没有对应的return,则会返回随机值
(5)写分支结构的语句要注意每一个分支都要有返回值,否则会出现编译错误
(6)其返回值可为一个表达式或一个数值
(7)简化:其返回值可以直接为逻辑表达式或关系表达式,返回类型写成bool(记得引用对应的头文件),返回值为1或0,可以省去用else-if判断的部分
3.函数参数:
(1)若什么参数都不需要要写void,表示不需要参数
(2)函数的形式参数和实际参数
(i)形式参数:当函数只是定义,而不调用的时候,其只是形式上存在,不会向内存申请空间,不会占用内存空间,不会真实存在,只有当函数调用的时候才会先栈区申请空间存放实参传过来的值(创建自己的空间来存放实参的值)
(ii)实际参数:主函数实实在在传过去的值
(iii)关系:实参只是将其值传给了形参做计算而已,实际上形参和实参所占不为同一块空间,对形参的修改不会影响实参,形参相当于实参的一份临时拷贝
(iv)实际的操作过程:
形参在函数内部操作完成后将返回值存于寄存器中,然后形参进行内存释放(即销毁变量),然后寄存器将返回值带回主函数中对应的位置
(4)函数体:函数实现计算的过程
例子:函数的运行就好似将原材料(参数)加入工厂(函数)得到产品(返回结果)
1.当需要遍历整个数组(即需要对整个数组内部元素进行操作时),需要传两个参数:数组名和数字个数,这样才能实现对整个数组进行操作
注:不能在函数内部求数组元素个数的原因:
2.数组的形参:
(1)实际参数为数组,形式参数也可以为数组(或者写成元素类型对应的指针也可)
(2)一维数组的形式参数可以不写,二维数组的行可以不写,列要写
(3)数组的形参和实参操作是同一个数组(传址调用)
(4)注意:在调试的时候,在监视窗口观察形参的时候需要在形参的后面加逗号及所要观察的数组元素个数,其才会对应也显示出来,否则无法看到
3.特别注意:在传数组的时候要传数组名,而不是arr[10],其相当于传了数组下标为10的那个元素过去
1.嵌套调用:
(1)概念:在一个函数内部调用另一个函数
(2)注意点:函数可以嵌套调用,但是不可以嵌套定义,函数与函数之间是并列的
例如在主函数内部不可以定义其他函数,只能进行调用
2.链式访问:
(1)概念:一个函数的返回值作为另一个函数的参数
(2)例子:printf的例子 printf的返回值:成功在屏幕上打印显示的字符总数
(3)注意点:strlen()的返回值是size_t类型的,其在之后写的时候变量的类型最好要做到对应,并且最好用%zd打印
(4)顺序特点:其在调用的时候是由外向里调用的,在返回的时候是由内向外返回的,要里面的函数调用完成作为参数,外部的函数才能进行
1.单个文件:
(1)定义放于使用前面(无事发生)
(2)定义放于使用后面(会报错未标示符)
综上,函数一定先声明再使用(定义属于一种特殊的声明,前面有定义也可以
2.函数的声明:
(1)包括:返回类型,函数名,函数参数(参数可以只交代类型,不写形参名字)
3.多个文件:
(1)头文件:函数的声明和类型的声明
(2)源文件:函数的实现(即定义)
注:(1)此时要使用源文件中定义的函数要包含其对应的头文件(本质就是在完成函数的声明)
(2)自己写的头文件要用”“而不是<>
(3)或者可以使用extern声明外部符号(函数或变量),其写法与函数的声明一样,返回类型,函数名,函数参数,可以做到与引用头文件相同效果(不过只能针对某个函数或变量)
4.将函数实现和函数声明分离的好处:可以实现代码的隐藏,将头文件和静态库卖给商家,但是不让他看到对应的源代码
方法:导入静态库,隐藏源代码
使用:引用#pragma comment (lib,"对应的文件名.lib")+引用对应的头文件
1.性质:二者都属于关键字
2.作用域:变量可以使用的范围
(1)局部变量的作用域就是其所在的范围
(2)全局变量的作用域是整个工程
3.生命周期:变量创建(申请内存空间)到变量销毁(内存释放 收回内存)的这段时期
(1)局部变量的生命周期是其进入作用域到其出作用域的这段时期
(2)全局变量的生命周期是整个工程
main函数的生命周期就是整个程序的生命周期
4.内存空间的分配:分为三个区
(1)栈区:用于存放局部变量,形式参数
(2)堆区:动态内存管理,malloc,realloc,calloc,free
(3)静态区:全局变量和静态变量
5.static(静态的):可修饰局部变量,全局变量,函数
(1)局部变量:
(i)本质:改变其存储类型,将本来存放于栈区的局部变量存放于静态区,在静态区的局部变量与全局变量的生命周期相同,和程序的生命周期一样长,只有程序销毁
(ii)变化:延长了其生命周期,生命周期变为整个工程,但没有改变其作用域,其仍然只能在其对应的作用域使用
(iii)用途:适用于对于一个变量希望它能有累积的效果或希望保留他的值,在之后还能再使用,而不是出了作用域就销毁
(2)全局变量:
(1)本质:改变了其链接属性(本来全局变量默认有外部链接属性,修饰后就没有了)
(2)变化:其生命周期没有变化,但是其作用域发生了变化,只能在自身的源文件内部使用该全局变量,由外部链接属性变为了内部链接属性
(3)用途:当需要将变量隐藏起来,不想被其他文件发现,只在本源文件内使用时,可以使用它来修饰全局变量
(3)函数:使用效果与全局变量基本相同,适用于想将函数隐藏起来,不被其他源文件发现,只在本源文件内部进行使用的情况
6.extern:
(1)用途:用于声明外部符号(外部函数或全局变量)(与直接引用头文件能起到相类似的效果)
(2)写法:
函数:与函数声明相同,写函数返回类型,函数名,函数参数
全局变量:类型+变量名
注:如果没有进行声明或引用头文件,会出现链接性错误
因篇幅问题不能全部显示,请点此查看更多更全内容