七.函数
函数的别称是方法,函数也就是完成某一特定功能的模块。
函数终止运行并返回到调用它的函数中去的常用方法:
- 当执行到函数的最后一条语句后返回;
- 当执行到语句return时返回。
1.函数类别
库函数:由C语言系统提供;用户无需定义,也不必在程序中作类型说明;只需在程序前包含有该函数定义的头文件。
自定义函数:用户根据需要而编写的函数。
无参函数:通常用来执行一些功能比较固定单一的语句。例:getchar();
有参函数:通常通过处理传递过来的参数,将函数值返回给调用处。例:sqrt(num);
2.函数的调用
函数的调用可能是由另一个函数触发,但函数的定义都是平行的,包括main函数在内。
平行有两层含义:一是不允许把一个函数定义在另一个函数内;二是不同函数定义放置位置没有关系,可以定义在main之前或main之后。
函数调用类型:先定义后调用;函数声明+函数调用。
3.函数定义与声明的语法
(1)函数定义有4个要素:参数列表,返回类型,函数名,函数体。
返回类型 函数名(参数列表)
{
函数体;
}
函数名的本质是内存的代码地址。
(2)函数声明语法
基本形式:
返回类型 函数名(数据类型 形参,数据类型 形参,数据类型 形参,。。。);
返回类型 函数名(数据类型 ,数据类型 ,数据类型 ,。。。);
(3)两者区别
- 函数定义四个要素不可或缺,函数声明被用来通知编译器被调函数的返回类型、名称和参数类型信息,相当于“接口”,声明时没有函数体而且形参的类型是关心的要点,形参的名称在声明时可省略。
- 在某些情况下,函数的声明可以省略,如函数先定义后调用的情况,但函数的定义不能省略,且只能定义一次。
- 函数定义结束时不用加分号,声明结束时必须加分号。直接在函数头后加上分号可作为函数声明。
4.形参和实参
【内存】函数调用之前,形式参数,也就是函数定义时()里的参数,值都不确定,不确定的值,不会分配内存,只有调用函数的时候,才会分配内存新建一个变量接受实际参数的值,当函数调用结束的时候,形参占据的内存会被回收。
实际参数是函数调用的时候,函数传递的确切值就是实际参数,实际参数可以是常量、表达式或者变量。
形参与实参内存地址不同,占用不同的内存空间。
函数调用时,编译器通过函数定义或声明知道形参类型,如果用户传递给被调用函数的实参不满足类型要求,则会产生类型转换,将实参转换成形参类型。
注:
- 实参向形参的数据传递是单向的“值传递”。
- 实参和形参的顺序应该一致且个数相等。
- 实参和形参的数据类型应尽量把持一致。
【副本机制】函数形式参数与实际参数的副本机制:
普通的变量有副本机制,数组没有副本机制,结构体也有副本机制。
结构体变量有副本机制,结构体数组没有副本,结构体变量中有数组也有副本机制。
5.return语句
使用return语句,可以使函数向调用处返回一个值。
功能:立即从所在的函数体中退出,返回到调用它的程序中去,同时返回一个值给调用它的函数。
当函数类型被定义为void类型以外的任意一种类型,函数内部必须出现return语句。
return语句中表达式的类型应与函数值类型一致,不一致时以函数值的类型为准。
6.调用函数
通过在程序中使用函数名称,可以执行函数中包含的语句,称为调用函数
函数之间允许相互调用,也允许嵌套调用
函数自己调用自己,称为递归调用