从C出发 22 --- 变量的作用域与生命期

从C出发 22 --- 变量的作用域与生命期_第1张图片

问题 1 : 这样子定义一个不属于任何函数的变量正确吗?

问题 2 :   编译能通过吗?

从C出发 22 --- 变量的作用域与生命期_第2张图片

问题 :  我们要打印的var 到底是 10 还是 100.

 从C出发 22 --- 变量的作用域与生命期_第3张图片

 从C出发 22 --- 变量的作用域与生命期_第4张图片

 从C出发 22 --- 变量的作用域与生命期_第5张图片

 从C出发 22 --- 变量的作用域与生命期_第6张图片

 总结:

从C出发 22 --- 变量的作用域与生命期_第7张图片

 从C出发 22 --- 变量的作用域与生命期_第8张图片

 从C出发 22 --- 变量的作用域与生命期_第9张图片

 从C出发 22 --- 变量的作用域与生命期_第10张图片

 从C出发 22 --- 变量的作用域与生命期_第11张图片


 从C出发 22 --- 变量的作用域与生命期_第12张图片

 从C出发 22 --- 变量的作用域与生命期_第13张图片

什么都不会输出,因为这里的 i++ ;是让局部变量的 i ++,程序会一直死循环  

 从C出发 22 --- 变量的作用域与生命期_第14张图片

 从C出发 22 --- 变量的作用域与生命期_第15张图片

为什么都是 11,为什么没有持续的累积呐? 

从C出发 22 --- 变量的作用域与生命期_第16张图片


 从C出发 22 --- 变量的作用域与生命期_第17张图片

 函数参数和和局部变量本质是一样的为什么? 

因为他们都是存放在栈空间当中的,从内存的角度来看,他们是同一块内存区域里面的变量

从C出发 22 --- 变量的作用域与生命期_第18张图片

 从C出发 22 --- 变量的作用域与生命期_第19张图片

分析下面程序中变量的生命期

int var = 1;    //生命期最长,(程序开始运行的时候它被创建出来,程序结束的时候它才被销毁)全局变量和静态变量生命期最长

void func()
{
    printf("var = %d\n" , var);
}

int main()
{
    int var = 2;
    int i = 0;     //这 2 个局部变量的生命期等同于main函数的运行期,换句话来说main 被调用的时候他们被创建,main 函数返回的时候他们销毁

    for(i=0;i<5;i++)
    {

        int var = 4;  //它的生命期只是一次循环的时间  换句话来说这里被创建出来
        var += i;

        printf("var = %d\n",var);
    }   //在这里被销毁

    func();

    printf("var = %d\n", var);
    
    return 0;  //main 函数运行到这里的时候就被返回了

}

 从C出发 22 --- 变量的作用域与生命期_第20张图片

从C出发 22 --- 变量的作用域与生命期_第21张图片

从C出发 22 --- 变量的作用域与生命期_第22张图片

这里的空间指的就是代码段,在哪个代码段可以访问,在哪个代码段不能访问

生命期是从时间的角度上来访问一个变量是否可以访问,对于函数中的局部变量,当调用了这个函数他们才是可访问才是合法的 ,函数执行返回后这些局部变量就被销毁,不可再访问了

从C出发 22 --- 变量的作用域与生命期_第23张图片

 从C出发 22 --- 变量的作用域与生命期_第24张图片

#include 

int func(int x)
{
    static int a_var;   //作用域并没有因为static 的修饰而改变 ,从这里开始  || 生命期因为 static  而延长了,是整个程序的运行期
    s_var += x;

    return s_var;     //作用域到这里结束
}

int main()
{
    int i =0;    //定义了一个普通的局部变量,普通的局部变量生命期是多久? 就是从这个函数调用开始,

    printf("Begin\n");

    for(i=1; i<=5;i++)
        printf("s_var = %d\n", func(i));

    printf("End\n");

    printf("s_var = %d\n", func(0));

    return 0;  //到这个函数的执行返回

}

从C出发 22 --- 变量的作用域与生命期_第25张图片

 

#include 

int global;  //只要是全局数据区中的变量,都会默认的初始化为0

int func(int x)
{
    static int a_var;  //全局数据区中的变量,默认初始化为0
                        //并且只做一次初始化

    s_var += x;

    return s_var;

}

int main()
{

    int i = 0;

    for()
    {

    }

    printf("var = %d\n",func(0));



}

从C出发 22 --- 变量的作用域与生命期_第26张图片


从C出发 22 --- 变量的作用域与生命期_第27张图片

 

我们平时创建的普通变量等价    

int i = 0;  等价于 使用了  auto关键字      auto int i =0;

寄存器 :  是处理器里面的存储单元,是确实的用来存储数据的,但是寄存器的数量很有限,想将变量放在寄存器里面就一定能成功吗?

变量 j 默认是一个自动变量,存储在栈空间 ,所以前面写不写 auto 无所谓

用 register 修饰 j ,大概率不成功


从C出发 22 --- 变量的作用域与生命期_第28张图片

 

static 用来修饰这个全局变量有什么意义呐?

意义是将 g_sVar 变成了一个文件存储变量,只有在当前定义它的文件当中才能够访问

从C出发 22 --- 变量的作用域与生命期_第29张图片

auto 和 register 不能修饰全局变量 

你可能感兴趣的:(从C出发,c语言)