Linux系统下的C语言学习笔记(十一)

变量及生命周期

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值