函数的声明和定义
函数间调用关系是,由于函数调用其他函数,替他函数也可以互相调用,同一个函数可以被一个或多个函数调用任意次。
先声明,后调用。
#include <stdio.h> //去标准库下找文件
#include "stdio.h" //在当前目录下找自己定义的头文件
C语言的编译和执行具有一下特点:
- 一个C程序由一个或多个程序模块组成,每个程序模块作为一个源程序文件。对于较大的程序,通常将程序内容分别放在若干源文件中,再由若干源程序文件组成一个C程序。这样处理便于 分别编写、分别编译,进而提高调试效率。一个源程序文件可以为多个C程序共用。
- 一个源程序文件由一个或多个函数及其他有关内容(如命令行、数据定义等)组成。一个源程序文件是一个编译单位,在程序编译时是以源程序文件为单位而不是以函数为单位进行编译的。main.c和func.c 分别单独编译,在链接成为可执行文件时,main中调用的函数printstar和print_message会通过链接去找函数定义的位置。
- C程序的执行是从main函数开始的,如果在main函数中调用其他函数,那么在调用后会返回到main函数中,在main函数中结束整个程序的运行。
- 所有函数都是平行的,即在定义函数时是分别进行的,并且是相互独立的。一个函数并不从属于另一个函数,即函数不能嵌套定义。函数可以互相调用,但不能调用main函数。main函数是由系统调用的。main函数中调用print_message函数,而print_message函数中又嗲用printstar函数,我们把这种调用成为 “嵌套调用”。
函数声明与定义的差异:
- 函数的定义是指对函数功能的确立,包括制定函数名、函数值类型、形参及其类型、函数体等,它是一个完整的、独立的函数单位。
- 函数的声明的作用是把函数的名字、函数类型及形参的类型、个数和顺序通知编译系统,以便在调用该函数时编译系统能正确识别函数并检查调用是否合法。
隐式声明:C语言中有几种声明的函数名可以省略。例如,函数如果不显式地声明返回值类型,那么它默认返回类型。
函数的分类和调用
用户角度:
- 标准函数
- 自己定义的函数
- 无参函数
类型标识符 函数名(){
声明部分
语句部分
}
3. 有参函数
类型标识符 函数名(形式参数列表){
声明部分
语句部分
}
函数的递归调用
函数自身调用自身的操作,称为递归函数,递归函数一定要有结束条件。
递归的核心是找递归公式:
例如:n! 的 f(n)=n*f(n-1)
#include <stdio.h>
//假如有n个台阶,一次只能上一个台阶或两个台阶,请问走到第n个台阶共有几种走法
int step(int n){
if(1==n||2==n){ //当台阶数是1个或者2个时,递归结束
return n;
}
return step(n-1)+step(n-2);
}
int main() {
int n;
scanf("%d",&n);
printf("%d\n",step(n));
return 0;
}
局部变量与全局变量
全局变量-形参-实参解析
在不同的函数之间传递数据时,可以使用的方法如下:
- 参数:通过形式参数和实际参数。
- 返回值:用return语句返回计算结果。
- 全局变量:外部变量。
全局变量位于数据段。
int i 位于栈空间。
如果局部变量与全局变量重名,那么将采取就近原则,即实际获取和修改值是局部变量的值。
局部变量在离最近的大括号内有效。
{
int i = 3;
}
全局变量:全程变量 从定义处有效。