变量及生命周期
1.变量分类
1.1 变量分为局部变量和全局变量
1.2 局部变量都声明在函数里面,全局变量声明在所有函数外边
1.3 不论局部变量还是全局变量都分为静态和非静态两种
1.4 声明静态变量的时候需要使用static关键字
变量
局部变量 全局变量
静态 非静态 静态 非静态
/*
* 变量演示
* */
#include <stdio.h>
int val_g; //全局变量
static int val_sg; //静态全局变量
int main() {
int val = 0; //非静态局部变量
static int val_s; //静态局部变量
return 0;
}
2.变量的作用域
2.1 不同种类变量的使用范围不同
2.2 作用域是一种使用范围,它表示可以使用某个变量的所有语句
2.3 生命周期也是一种使用范围,它表示可以使用某个存储区的所有时间
2.4 非静态局部变量的作用域是函数内部的所有语句
2.5 非静态局部变量的生命周期是函数某一次执行的时间范围
2.6在函数开始执行的时候计算机会为非静态局部变量分配存储区,在函数结束的时候计算机会把非静态局部变量的存储区收走
2.7 每当函数重新执行时非静态局部变量对应的存储区都会发生变化,只要函数结束后记录在非静态局部变量里的数字就找不到了
2.8 静态局部变量的作用域也是函数里面的所有语句
2.9 静态局部变量的生命周期是整个程序的执行时间
2.10记录在静态局部变量里的数字只要程序没结束就一定可以找到
2.11 非静态全局变量的作用域包含程序里的所有语句
2.12 非静态全局变量的生命周期是整个程序的执行时间
2.13 静态全局变量的作用域只包含声明它的那个文件里的所有语句
2.14 静态全局变量的生命周期也是整个程序的执行时间
非静态局部变量类似于超市卖的包子
静态局部变量类似于超市里的收银机
静态全局变量类似于小区里的停车场
非静态全局变量类似于小区外的公共停车场
2.15 静态变量和全局变量的初始化都是在程序 开始的时候进行并且只做一次,(只进行一次,哪怕以后程序再执行到那里也不会再初始化)
/*
* 变量演示
* */
#include <stdio.h>
int val;
void func(void) {
static int val = 10;
printf("val是%d\n", val);
val = 100;
}
int main() {
func();
func();
return 0;
}
2.16 如果静态变量或全局变量没有初始化就会自动被初始化成0
2.17 全局变量和局部变量可以重名,这个变量名称优先代表局部变量,如果局部变量和全局变量都能满足要求应该优先选择局部变量(全局变量的生命周期是整个程序的执行时间,如果程序没有结束,那么那块内存将一直被占用)
3.练习
3.1 接上一个问题,为什么程序执行时间过长?(解释:被调函数执行时,会从调用函数分出一部分时间,然后被调函数调用自己,循环往复,在递归完成之前,时间一直被被调函数占用无法释放,所以数字越大,时间越长)
/*
* 生命周期练习
* */
#include <stdio.h>
int arr[50];
int fei(int sn) {
//static int arr[50];
if (sn <= 1) {
return 1;
}
if (!arr[sn - 2]) {
//数组里还没有记录编号
//为sn - 2的数字
arr[sn - 2] = fei(sn - 2);
}
if (!arr[sn - 1]) {
//数组里还没有记录编号
//为sn - 1的数字
arr[sn - 1] = fei(sn - 1);
}
return arr[sn - 2] + arr[sn - 1];
}
int main() {
int sn = 0;
printf("请输入编号:");
scanf("%d", &sn);
printf("结果是%d\n", fei(sn));
return 0;
}