目录
1. 函数定义
2. 函数调用
3. 递归
4. 数组作为函数参数
5. 局部变量和全局变量
5.1 存储类别的关键字
1. 函数定义
语法:
类型标识符 函数名(形式参数)
{函数体代码
}
(1)类型标识符 --- 数据类型(函数要带出的结果的类型)
注:数组类型不能做函数返回结果的类型,如果函数不需要带出什么结果,此时返回结果的类型说明符为void,如果返回结果的类型与类型说明符不一致,以类型说明符为准(类型说明符不写,默认为int)。
(2)函数名 --- 标识符,符合标识符命名规则
(3)形式参数 --- 表示改函数需要用到的数据
注:每一个形参变量都得指定类型,实参和形参需要类型匹配,参数个数相同,顺序一一对应,如果不需要接收实际参数,形参一般设计为void
(4)函数体代码 --- 实现函数功能的代码。
写法:
数据类型 形参变量名1,数据类型 形参变量2...
int a,int bint a,b // 不能这样写
2. 函数调用
函数调用的本质:实际上是利用栈的结构,先进后出,保证了函数可以层层嵌套调用。
调用者和被调用者:main函数时整个程序的入口,只能是调用者
注:函数不支持嵌套定义,但是可以嵌套调用
函数名是函数的入口地址。
3. 递归
可以实现循环的功能,是一种特殊的循环。
直接递归:自己调用自己
间接调用:调用其他函数,其他函数调用了自己,这样又实现了调用自己。
代码实现思路:
(1)递推关系 --- 从问题n到问题n - 1;
(2)递推结束的条件
eg:前 n 项的累加求和
sum(n)=> sum(n-1)+ n //递推关系
n = 1; // 结束条件
#include<stdio.h>int sum(int n)
{if(n==1) // 递推结束条件{return 1;}else{return sum(n-1)+n; // 递推关系}
}int main(void)
{int n;printf("Input a num:");scanf("%d",&n);int ret = sum(n);printf("%d\n",ret);return 0;
}
代码运行结果:
4. 数组作为函数参数
(1)数组元素作为函数参数--- a[0]
(2)数组本身作为函数参数--- a
形参--- 写成数组形式,还需要数组长度
实参--- 数组名,数组长度
printfArray(int a[],int len) // 形参printArray(a,len); //调用
eg:打印数组元素
#include<stdio.h>void printArray(int a[],int len) // 定义形参
{int i = 0;for(i = 0;i < len;++i){printf("a[%d] = %d\n",i,a[i]);}
}int main(void)
{int a[] = {1,2,3,4,5,6,7,8,9};int len = sizeof(a)/sizeof(a[0]);printArray(a,len); // 调用时传入实参return 0;
}
5. 局部变量和全局变量
局部变量:空间 一般都开栈上 如果不初始化,局部变量中的值是随机值(垃圾值)
全局变量:作用于全局区如果不初始化,默认初始化为0
局部变量的生命周期 :从程序运行到定义处开始存在,到程序运行到 它作用范围结束 时 销毁
全局变量(静态变量)的生命周期:从程序开始运行时就存在了,直到整个程序运行结束时销毁
注意:全局变量和静态变量,不能用"变量"进行初始化
5.1 存储类别的关键字
auto 表示它是一个自动变量 (局部变量)
static static 修饰局部变量,此时会被放在全局区
注:
1.static 修饰局部变量 ---只会被初始化一次
2.static 修饰的变量 --- 具有继承性
3.static 修饰的变量 -- 只能用常量初始化 (不能用变量初始化)
extern 外部的 ---表示你的变量 是存在外部的 ,只能 声明 全局变量