——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
函数:功能相对独立的代码段;
C语言程序就是有很多功能相对独立的代码段组成的。
C语言是面向过程的语言,最大的标志是它是由一个个函数组成的,而面向对象的标志是由一个个对象(类)组成的。
函数分为:库函数(系统定义的)和用户定义的函数
用户定义函数:需要用户自己编写的函数。对于这种函数,不仅用户需要定义函数本身,还需要在主调函数中加入对被调函数的类型声明,这样才能使用。
有返回值函数:表示函数执行完后,向调用者返回一个返回值。
无返回值函数:只是完成特定功能,没有返回值。类型是void 空类型。
自定义函数的书写格式:
函数定义到使用分三步:1、声明 2、定义函数 3、调用函数
格式: 返回值类型 函数名称(参数列表){ 函数体; }
自定义函数分类:
无参无返回值
无参有返回值
有参无返回值
有参有返回值
函数的参数:
形式参数:定义函数的时候,函数名后面小括号里的参数就是形参。形参是什么样的类型,实参就必须是什么样的类型。
注意:1)形参定义后并不会马上分配存储空间。在函数调用的时候才会正真的分配存储空间。
2)如果有多个参数,需要用逗号分隔。
3)形参的类型可以不相同。
4)函数中不可以定义和形参名相同的变量,这等同于同意变量名重复定义。
实际参数:在函数调用的时候,小括号中的参数。
实参可以是常量,变量,表达式,函数,但是在函数调用时它们必须有确定的值
实参必须和形参在类型,数量,顺序上保持严格的一致否则会发生类型不匹配的问题。
(系统调用main函数后,main函数的形参也会被分配存储空间,int argc,char* argv[])
参数传递过程:
系统调用main函数后,给argc,argv[],d都分配的存储空间,在给d赋值时调用了sum(),此时,给x,y分配了存储空间,分别传入了10和5.sum函数计算后返回15,赋值给d,然后,sum函数结束,存储空间释放。此时x,y消失,d的值为15.
函数的返回值:函数被调用之后,执行函数体中的程序段所取得的并返回给主调用函数的值。
返回值的注意事项:1)必须要用到关键字return
2)return 后面可以跟常量/变量/表达式
3)return 后面的值可以加括号,也可以不加括号,结果一样
4)如果return的值和函数定义的值的类型不一致,以函数的返回值类型为准。
5)函数的返回值类型为int,可以省略(尽量不要省略,会有警告)。
函数的声明:在函数调用之前对,函数的说明。(类似,变量使用之前要进行说明一样)
函数声明的作用:告诉编译器这个函数已经存在,告诉编译器这个函数的返回值类型。以便主调函数处理被调函数的返回的数据。
函数声明的注意事项:1)函数的返回值为int型,可以不用声明。(会有警告,最好声明。)
2)被调函数写在主调函数之前,此时可以不用声明。
3)函数的声明可以写在主调函数之中,也可以写在main函数之外,做全局声明,也可以做间接声明。
函数的调用:函数在调用时才可以使用,实参可以是常量,变量,也可以是表达式
调用的注意事项:1)可以当作函数表达式的一部分
2)函数调用可以当作另外的函数的参数。
3)函数可以嵌套调用
4)函数名不能和变量名同名
递归函数调用:(递归函数很耗资源,能不用尽量不用)
一个函数在它的函数体内对它自身进行调用,这是递归调用,该函数称为递归函数。
递归函数注意:1)主调函数就是被调函数
2)在递归函数中应该存在能够让递归结束的条件。
递归函数的调用流程:当递归函数使用时,会使用到内存栈(先进后出),递归函数调用后,开始进入内存栈底层,此时内存为它分配存储空间,当函数再次递归调用自身,新的递归函数再次进入递归栈,分配新的内存空间,这种情况一直会持续到递归结束,这些内存在这个过程中会被一直占用,直到递归到结束,此时,最晚分配内存的递归函数,获得自己的数据后传递给前一个递归函数,然后释放自身内存。内存这样依次释放,直到最先进入递归栈的函数获得自己的数据,完成计算,并返回主调用函数值时,它的内存才被释放。
从整个过程来看,最先进入内存栈的函数占用内存时间最长,假如多次递归后仍然到不了递归结束条件,内存会被不断连续分配造成内存不足。