目录
8.1 函数的定义
返回类型 函数名(类型 形式参数) { 语句 }
一、返回值
(一) 含义
通常希望通过函数调用得一个或多个确定值, 并将其称为返回值 (或函数值)
(二) 返回过程
通过函数中的 return 语句获得, 再在主函数中使用语句 (如赋值、打印等) 将返回值用在主函数中
(三) 类型
返回值的类型应为函数类型
※补充
A. 若return语句中表达式的类型与函数类型不匹配时,则表达式的类型将通过隐式转换变为函数类型
B. 函数不可返回数组, 但关于返回类型无其他限制
C. 当忽略返回类型时, C89会默认为int型,C99会报错
D. 对于不需要返回值的函数, 其函数类型为 “void”(空类型)
E. 若返回类型冗长时, 可将返回类型另置一行, 即:
返回类型 函数名(类型 形式参数) { 语句 }
二、形式参数
(一) 定义
函数定义时所声明的参数称为形式参数
(二) 作用
1° 定义了函数所需接受的参数类型与个数
2° 在函数调用时接受实际参数的值
(三) 特殊形参(即数组)的声明
1° 一维数组形参
A.
类型名 数组名[数组长度]
B.
类型名 数组名[] ,int 数组长度
C.
类型名 [] ,int
2° 二维数组形参
A.
类型名 数组名[行数][列数]
B.
类型名 数组名[][列数] ,int 行数
3° 变长数组形参
A. 一维变长数组形参
a.
int 数组长度 ,类型名 数组名[数组长度]
b.
int 数组长度 ,类型名 数组名[]
c.
int ,类型名 数组名[]
等
B. 二维变长数组形参
a.
int 行数 ,int 列数 ,类型名 数组名[行数][列数]
b.
int 行数 ,int 列数 ,类型名 数组名[][]
等
※补充--关键字static
保证数组长度的实参至少为形参
类型名 数组名[static 数组长度] ,int 数组长度
(四) 形参个数对形参声明的影响
1° 有两个以上形参时, 每个形参都需说明类型, 并用逗号隔开
e.g.
void function(int a , int b , float c) { 语句 }
2° 当没有形参时, 函数名后的圆括号出现 void 或空着
(出现 void 更常见)
e.g.
void function(void) { 语句 }
void function() { 语句 }
8.2 函数的调用
一、作为语句调用
对于void型函数:
函数名(实际参数);
函数名();
二、作为表达式调用
对于非void型函数 (格式可变形) :
变量 = 函数名(实际参数);
三、作为变量调用
对于非void型函数:
e.g.
printf("%d", function(实际参数));
8.3 C99中的函数声明 (函数原型)
一、定义
返回类型 函数名(类型 形参);
※ 函数顺序
(一) C99:函数声明 → main函数 → 函数
(二) C89:main函数 → 函数
8.4实际参数
一、定义
调用函数时传递给它们的具体值或者表达式
二、实际参数的传递
(一) 通过值传递
(二) 单向传递,实参→形参
三、实际参数的转换
(一)函数调用前遇到函数原型
隐式转换
(二)函数调用前未遇到函数原型
1°默认提升: A. float型实参→double型
B. char型实参、short型实参→int型
2°强制转换
8.5 复合字面量
一、定义
通过指定其包含的元素而创建的无名数组
二、格式
先在一对圆括号内给定数组的类型名,随后在一对花括号内设定所包括元素的值
e.g.
(int []){1,2,5} 表示含元素 1,2,5 的 int 型数组
三、应用
(一) 简化代码
(二) 用于想临时创建、不想分配永久数组名的情况
8.6 程序终止
对于main函数,必有返回值,其正常返回类型为int型,其值为状态码(0表示正常终止,非0表示异常终止),而返回时用以下语句或函数
一、return语句:
return 表达式; //表达式的值为 0 或 非0
二、exit函数:
exit(表达式); //表达式的值为 0 或 非0 //在 <stdlib.h> 头中,EXIT_SUCCESS 可表示 0,EXIT_FAILURE 可表示 非0
8.7 递归
一、含义
若函数调用它本身,则该函数递归
二、分类
(一) 直接递归
(二) 间接递归
三、基本思想
(一) 递推阶段:简化原问题,得到规模更小的类似于子问题
(二) 回归阶段:将子问题的解回归到原问题的解
四、注意事项
为防止递归无终止地进行,需在函数内设有终止递归的条件