有参函数和无参函数的唯一区别在于:函数 () 中多了一个参数列表。
形参与实参
函数的参数分为形参和实参两种。
形参是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数。
实参是在调用时传递该函数的参数。
函数的形参和实参具有以下特点:
- 形参只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只有在函数内部有效
- 实参可以是常量、变量、表达式、函数等
- 在参数传递时,实参和形参在数量上,类型上,顺序上应严格一致,否则会发生类型不匹配的错误
函数的返回值
函数的返回值是指函数被调用之后,执行函数体中的程序段所取得的并返回给主调函数的值。
函数的返回值要注意以下几点:
- 函数的值只能通过return语句返回主调函数
return语句的一般形式为:
return 表达式
或者为:
return (表达式);
- 函数值的类型和函数定义中函数的类型应保持一致
如果两者不一致,则以函数返回类型为准,自动进行类型转换。
- 没有返回值的函数,返回类型为void
递归函数
递归就是一个函数在它的函数体内调用它自身,递归函数必须有结束条件。
执行递归函数将反复调用其自身,每调用一次就进入新的一层。
一句话总结递归:自我调用且有完成状态。
例题:
有5个人坐在一起,问第5个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第3个人,又说比第2人大两岁。问第2个人,说比第1个人大两岁。最后 问第1个人,他说是10岁。请问第5个人多大?
程序分析:
利用递归的方法,递归分为回推和递推两个阶段。要想知道第5个人岁数,需知道第4人的岁数,依次类推,推到第1人(10岁),再往回推。
#include <stdio.h>
int dfs(int n) {
return n == 1 ? 10 : dfs(n - 1) 2;
}
int main()
{
printf("第5个人的年龄是%d岁", dfs(5));
return 0;
}
局部与全局
C语言中的变量,按作用域范围可分为两种,即局部变量和全局变量。
- 局部变量也称为内部变量。局部变量是在函数内作定义说明的。其作用域仅限于函数内, 离开该函数后再使用这种变量是非法的。在复合语句中也可定义变量,其作用域只在复合语句范围内
- 全局变量也称为外部变量,它是在函数外部定义的变量。它不属于哪一个函数,它属于一个源程序文件。其作用域是整个源程序
变量存储类别
C语言根据变量的生存周期来划分,可以分为静态存储方式和动态存储方式。
静态存储方式:是指在程序运行期间分配固定的存储空间的方式。静态存储区中存放了在整个程序执行过程中都存在的变量,如全局变量。
动态存储方式:是指在程序运行期间根据需要进行动态的分配存储空间的方式。动态存储区中存放的变量是根据程序运行的需要而建立和释放的,通常包括:函数形式参数;自动变量;函数调用时的现场保护和返回地址等。
C语言中存储类别又分为四类:
- 自动(auto)
- 静态(static)
- 寄存器的(register)
- 外部的(extern)
用关键字auto定义的变量为自动变量,auto可以省略,auto不写则隐含定为“自动存储类别”,属于动态存储方式。如:
用static修饰的为静态变量,如果定义在函数内部的,称之为静态局部变量;如果定义在函数外部,称之为静态外部变量。如下为静态局部变量:
注意:静态局部变量属于静态存储类别,在静态存储区内分配存储单元,在程序整个运行期间都不释放;静态局部变量在编译时赋初值,即只赋初值一次;如果在定义局部变量时不赋初值的话,则对静态局部变量来说,编译时自动赋初值0(对数值型变量)或空字符(对字符变量)。
为了提高效率,C语言允许将局部变量得值放在CPU中的寄存器中,这种变量叫“寄存器变量”,用关键字register作声明。例如: