第一节:函数的声明与定定义
1. 函数的声明与定义
函数间的调用关系是:由主函数调用其他函数,其他函数也可以互相调用。同一个函数可以被一个或多个函数调用任意次。
#include "func.h"
int main() {
int a=10;
a=print_star(a);
print_message();
print_star(a);
return 0;
}
#include "func.h"
int print_star(int i){
printf("***************\n");
printf("print_start %d\n",i);
return i+3;
}
void print_message(){
printf("how do you do\n");
print_star(3);
}
#ifndef INC_7_1_STATEMENT_FUNC_H
#define INC_7_1_STATEMENT_FUNC_H
#include <stdio.h>
#include <stdlib.h>
int print_star(int i);
void print_message();
#endif //INC_7_1_STATEMENT_FUNC_H
F:\Computer\Project\practice\7\7.1-statement\cmake-build-debug\7_1_statement.exe
***************
print_start 10
how do you do
***************
print_start 3
***************
print_start 13
进程已结束,退出代码为 0
func.c是子函数print_star和print_message的实现,也称定义。main.c是main函数,func.h中存放的是标准头文件的声明和main函数中调用的两个子函数的声明。如果不在头文件中对使用的函数进行声明,那么在编译时会出现警告。
C语言编译和执行具有以下特点:
-
一个C程序由一个或多个程序模块组成,每个程序模块作为一个源程序文件。这样处理便于分别编写、分别编译、进而提高调试效率。一个源程序文件可以为多个C程序公用。
-
一个源程序文件由一个或多个函数及其他有关内容(如命令行,数据定义等)组成。一个源程序文件是一个编译单位。
-
C程序的执行是从main函数开始的,如果在main函数中调用其他函数,那么在调用后会返回到main函数中,在main函数中结束整个程序的运行。
-
所有函数都是平行的,即在定义函数时是分别进行的,并且是互相独立的。一个函数并不从属于另一个函数,即函数不能嵌套定义。但函数间是可以互相调用的,即可以嵌套调用,但不能调用main函数,main函数时由系统调用的。
函数的声明与定义的差异:
-
函数的定义是指对函数功能的确立,包括指定函数名、函数值类型、形参及其类型、函数体等。它是一个完整的,独立的函数单位。
-
函数声明的作用是把函数的名字、函数类型及形参的类型、个数和顺序通知编译系统,以便在调用该函数时编译系统能正确识别函数并检查调用是否合法。
隐式声明:函数如果不显示地声明返回类型,那么它默认返回整型。一般都需要显示声明。
2. 函数的分类
函数分为两种类型:
-
标准函数:即库函数,这是由系统提供的,用户不必自己定义的函数,可以直接使用他们。如printf函数,scanf函数。
-
用户自己定义的函数:用以解决用户的专门需要。分为无参函数和有参函数。
第二节:函数的递归调用
函数自身调用自身的操作,称为递归函数,递归函数一定要有结束条件,否则会产生死循环。
使用递归在解决一些问题时,可以让问题变得简单,降低编程难度。
题目:假如有n个台阶,一次只能上1个台阶或2个台阶,请问走到第n(n为正整数,可自行指定)个台阶有几种走法?
#include <stdio.h>
int step(int n){
if(1==n || 2==n){ // 结束条件
return n;
}
return step(n-1)+step(n-2); // 公式
}
int main() {
int n;
int ret;
scanf("%d",&n);
ret=step(n);
printf("step total=%d\n", ret);
return 0;
}
F:\Computer\Project\practice\7\7.2-recursion\cmake-build-debug\7_2_recursion.exe
5
step total=8
进程已结束,退出代码为 0
方法步骤:找公式,写结束条件。
第三节:全局变量
1. 全局变量-形参-实参解析
在不同函数之间传递数据时,可以使用的方法如下:
- 参数:通过形式参数和实际参数。
- 返回值:用return语句返回计算结果。
- 全局变量:外部变量。
全局变量存储在数据段,所以main函数和print函数都是可见的。全局变量不会因为某个函数执行结束而消失,在整个进程的执行过程中是始终有效。工作中应尽量避免使用全局变量。
如果局部变量和全局变量重名,那么将采取就近原则,即实际获取和修改的值是局部变量的值。
全局变量在程序的全部执行过程中都占用存储单元,而不是仅在需要时才开辟存储单元。
关于形参与实参的一些说明:
-
定义函数中指定的形参,如果没有函数调用,那么他们并不占用内存中的存储单元,只有在发生函数调用时,形参才会被分配内存单元。调用结束后,形参所占的内存单元会被释放。
-
实参可以是常量,变量或者表达式,但要求他们有确定的值。
-
形参可以有多个,使用逗号隔开。同时指定形参的类型。
-
实参与形参的个数相等,类型相匹配,且实参与形参按照顺序对应,一一传递。
-
实参向形参数据传递是单向“值传递”,只能由实参传给形参。
-
形参相当于局部变量,因此不能在定义局部变量与参数同名。
2. 局部变量与全局变量
1. 局部变量
在一个函数内部定义的变量称为内部变量。它只在本函数范围内有效,即只有在本函数内才能使用这些变量,也称局部变量。
局部变量的有效范围是离自己最近的花括号。
2. 外部变量
函数之外定义的变量称为外部变量。外部变量可以为文件中的其他函数共用,它的有效范围是从定义变量的位置开始到本源文件结束,所以也称全程变量。
C语言一般要求把程序中的函数做成一个封闭体,除可以通过“实参->形参”的渠道与外界发生联系外,没有其他渠道。